数据结构与算法之 leetcode 图论最小高度树 树的中心节点

数据结构与算法阿木 发布于 4 天前 1 次阅读


图论最小高度树:树的中心节点求解

在图论中,树是一种特殊的有向无环图(DAG),它由节点和边组成,其中每个节点都通过边与其它节点相连。在许多实际问题中,我们需要找到一种方式来最小化树的高度,以便优化算法性能或资源使用。本文将探讨如何求解图论中的最小高度树问题,即找到树的中心节点。

树的中心节点是指从该节点到树中所有其他节点的距离之和最小的节点。在平衡二叉树、最小生成树(MST)等数据结构中,中心节点的概念非常重要。本文将围绕这一主题,通过LeetCode上的相关题目,介绍求解最小高度树的算法和代码实现。

LeetCode题目分析

LeetCode上的最小高度树问题通常以以下题目形式出现:

题目描述:给定一个无向连通图,找到树的高度最小的节点,即树的中心节点。

输入:一个整数数组`nums`,表示图中节点的连接关系。

输出:一个整数,表示树的中心节点。

算法思路

求解最小高度树问题,我们可以采用以下步骤:

1. 构建图:根据输入的数组`nums`构建无向图。

2. 寻找中心节点:通过深度优先搜索(DFS)或广度优先搜索(BFS)找到树的中心节点。

构建图

构建图的方法有很多,这里我们使用邻接表来表示图。邻接表是一种存储图的方式,它使用一个数组来存储图中所有节点的邻接节点。

python

def build_graph(nums):


graph = {}


for i in range(len(nums)):


graph[i] = []


for i in range(0, len(nums), 2):


graph[nums[i]].append(nums[i+1])


graph[nums[i+1]].append(nums[i])


return graph


寻找中心节点

寻找中心节点的方法有很多,这里我们介绍两种常用的方法:DFS和BFS。

DFS方法

DFS方法的基本思想是,从任意节点开始遍历,记录每个节点的子节点数量。遍历结束后,找到子节点数量最少的节点,即为树的中心节点。

python

def find_center_dfs(graph):


def dfs(node, parent):


count = 1


for neighbor in graph[node]:


if neighbor != parent:


count += dfs(neighbor, node)


return count

min_count = float('inf')


center_node = None


for node in graph:


count = dfs(node, -1)


if count < min_count:


min_count = count


center_node = node


return center_node


BFS方法

BFS方法的基本思想是,从任意节点开始遍历,记录每个节点的距离。遍历结束后,找到距离最短的节点,即为树的中心节点。

python

from collections import deque

def find_center_bfs(graph):


queue = deque([(node, 0) for node in graph])


min_distance = float('inf')


center_node = None


while queue:


node, distance = queue.popleft()


if distance < min_distance:


min_distance = distance


center_node = node


for neighbor in graph[node]:


if neighbor not in visited:


visited.add(neighbor)


queue.append((neighbor, distance + 1))


return center_node


代码实现

以下是一个完整的代码实现,包括构建图和寻找中心节点的函数:

python

def build_graph(nums):


graph = {}


for i in range(len(nums)):


graph[i] = []


for i in range(0, len(nums), 2):


graph[nums[i]].append(nums[i+1])


graph[nums[i+1]].append(nums[i])


return graph

def find_center_dfs(graph):


def dfs(node, parent):


count = 1


for neighbor in graph[node]:


if neighbor != parent:


count += dfs(neighbor, node)


return count

min_count = float('inf')


center_node = None


for node in graph:


count = dfs(node, -1)


if count < min_count:


min_count = count


center_node = node


return center_node

def find_center_bfs(graph):


from collections import deque


queue = deque([(node, 0) for node in graph])


min_distance = float('inf')


center_node = None


while queue:


node, distance = queue.popleft()


if distance < min_distance:


min_distance = distance


center_node = node


for neighbor in graph[node]:


if neighbor not in visited:


visited.add(neighbor)


queue.append((neighbor, distance + 1))


return center_node

示例


nums = [1, 2, 3, 4, 5, 6]


graph = build_graph(nums)


center_node_dfs = find_center_dfs(graph)


center_node_bfs = find_center_bfs(graph)


print("DFS方法找到的中心节点:", center_node_dfs)


print("BFS方法找到的中心节点:", center_node_bfs)


总结

本文介绍了图论中最小高度树问题的求解方法,包括构建图和寻找中心节点。通过DFS和BFS两种方法,我们可以找到树的中心节点,从而最小化树的高度。在实际应用中,根据具体问题选择合适的算法和实现方式非常重要。