二叉树直径的路径
Path of the diameter of a binary tree
我有一个二叉树和一个最长路径(直径)大小的方法:
int diameter(struct node * tree)
{
if (tree == 0)
return 0;
int lheight = height(tree->left);
int rheight = height(tree->right);
int ldiameter = diameter(tree->left);
int rdiameter = diameter(tree->right);
return max(lheight + rheight + 1, max(ldiameter, rdiameter));
}
我希望函数也返回确切的路径(所有节点的直径列表)。我该怎么做呢?
谢谢
你有两个选择:一)认为。B)搜索。在google的前几个点击中,你可以找到这个:http://login2win.blogspot.hu/2012/07/print-longest-path-in-binary-tree.html
选择A)如果你想学习,选择B)如果你不在乎,只想要一个快速的,尽管不一定是完美的解决方案。
有许多可能的解决方案,其中一些:
- 在分而治之的方法中,你可能最终会保留到目前为止两边最长的路径,并只保留较长的路径。
- 引用的解决方案执行两次遍历,一次用于确定直径,第二次用于打印。这是一个很好的技巧来克服不知道我们是否在方法1的最深点的问题。 比起深度优先的搜索,做广度优先的搜索。使用队列。对存储父节点的每个节点逐级执行。当您到达最后一层(队列中没有添加子节点)时,您可以轻松地打印整个路径,因为最后打印的节点位于最长的路径上,并且您有父链接。
在节点结构中添加属性struct node * next
。在返回语句之前,添加像tree->next = (ldiameter > rdiameter ? tree->left : tree->right)
这样的行,以获得较长的路径节点作为下一个节点。在调用diameter(root)
之后,您应该能够从根节点开始遍历所有下一个节点,以打印最大的路径。
我认为以下方法可能有效…在O(N)时间内计算如下直径
// this is a c++ code
int findDiameter(node *root, int &max_length, node* &max_dia_node, int parent[], node* parent_of_root){
if(!root) return 0;
parent[root->val] = parent_of_root->val;
int left = findDiameter(root->left, max_length);
int right = findDiameter(root->right, max_length);
if(left+right+1 > max_length){
max_dia_node = root;
max_length = left+right+1;
}
return 1 + max(left,right);
}
在这个函数中发生了多少件事。首先max_length计算树的最大直径。然后我把max_dia_node赋值给这个节点。
这是我要让最大直径经过的节点。
现在使用这些信息,我们可以找到这个节点的最大深度左子和右子(max_dia_node)。从那里我们可以通过"父"数组得到实际的节点。
这是树的两次遍历
相关文章:
- 从父数组测试用例构造二叉树失败
- 打印时有二叉树问题.用户输入不打印任何内容
- 试图找到二叉树的深度
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 指向二叉树中新节点的指针
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- C++:如何计算二叉树中其值模块高度小于 2 的节点数?
- 二叉树级别顺序遍历在leetcode中
- 运行无限循环的最小二叉树问题
- 打印二叉树中的常见元素
- 二叉树基准测试结果
- 带有矢量重复值的二叉树打印出来
- 签入二叉树的函数是平衡C++
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 如何计算给定数字在二叉树中出现的次数?
- 找到最大路径总和,我们可以在二叉树中的任何节点开始和结束
- 如何在二叉树中得到最大路径代价
- 二叉树中的最小路径和
- 二叉树直径的路径
- 列出并计算二叉树从根结点到叶结点的权重最大的路径