求二叉树中节点的最大距离..........

生气题目描述:

       如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间的边的个数。写一个程序,求一颗二叉树中相距最远的两个节点之间的距离。


微笑分析与解答:

根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论。

对于任意一个节点,以该节点为根,假设这个根有K个孩子结点,那么相距最远的两个节点U和V之间的路径与这个根节点的关系有两种情况:

1.      若路径经过根Root,则U和V是属于不同子树的,且它们都是该子树中道根节点最远的节点,否则跟它们的距离最远相矛盾。这种情况如图3-13所示:


2.      如果路径不经过Root,那么它们一定属于根的K个子树之一。并且它们也是该子树中相距最远的两个顶点。如图:


因此,问题就可以转化为在字数上的解,从而能够利用动态规划来解决。


设第K棵子树中相距最远的两个节点:Uk和Vk,其距离定义为d(Uk,Vk),那么节点Uk或Vk即为子树K到根节点R距离最长的节点。不失一般性,我们设Uk为子树K中到根节点Rk距离最长的节点,其到根节点的距离定义为d(Uk,R)。取d(Ui,R)(1<=i<=k)中最大的两个值max1和max2,那么经过根节点R的最长路径为max1+max2+2,所以树R中相距最远的两个点的距离为:max{d(U1,V1),…, d(Uk,Vk),max1+max2+2}。

采用深度优先搜索如图3-15,只需要遍历所有的节点一次,时间复杂度为O(|E|)=O(|V|-1),其中V为点的集合,E为边的集合。

求二叉树中节点的最大距离 - seven - Seven 的博客

代码如下:利用二叉树实现该算法:

//数据结构定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现完全二叉树输出的 Python 代码: ```python class Node: def __init__(self, val): self.val = val self.left = None self.right = None def printTree(root): """ 输出完全二叉树 """ if not root: return # 层数 depth = getDepth(root) # 最后一层节点数 last_nodes = getLastLevelNodes(root, depth) # 节点值的最大宽度 val_width = len(str(max(last_nodes))) # 每个节点间的距离 node_space = val_width + 2 # 遍历每一层 for i in range(1, depth+1): # 每层节点数 level_nodes = pow(2, i-1) # 前面的空格数 space_num = pow(2, depth-i) - 1 # 输出每个节点 for j in range(level_nodes): # 节点值 val = getNodeValue(root, i, j, depth) # 输出节点值 print(" "*val_width + " "*node_space * space_num, end="") print(str(val).center(val_width), end="") print(" "*node_space * space_num, end="") print("") def getDepth(root): """ 获取完全二叉树的深度 """ depth = 0 while root: depth += 1 root = root.left return depth def getLastLevelNodes(root, depth): """ 获取最后一层节点值 """ nodes = [] if not root: return nodes if depth == 1: nodes.append(root.val) else: nodes.extend(getLastLevelNodes(root.left, depth-1)) nodes.extend(getLastLevelNodes(root.right, depth-1)) return nodes def getNodeValue(root, level, index, depth): """ 获取指定位置的节点值 """ if level == 1: return root.val mid = pow(2, depth-1) // 2 if index < mid: return getNodeValue(root.left, level-1, index, depth-1) else: return getNodeValue(root.right, level-1, index-mid, depth-1) # 测试 root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) root.right.left = Node(6) printTree(root) ``` 输出结果如下: ``` 1 2 3 4 5 6 ``` 这里我们使用了三个辅助函数,分别是 `getDepth`、`getLastLevelNodes` 和 `getNodeValue`。其 `getDepth` 计算完全二叉树的深度,`getLastLevelNodes` 获取最后一层节点的值,`getNodeValue` 获取指定位置的节点值。最终 `printTree` 函数根据完全二叉树的特点,打印出一个美观的二叉树形式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值