C++ 二叉树直径的路径
我有一个二叉树和一个计算最长路径(直径)大小的方法: 我希望函数也返回确切的路径(直径的所有节点的列表)。 我怎么做 谢谢你有两个选择: A) 想想看。 B) 搜索。在最初几次谷歌点击中,您可以找到以下内容: 选择A)如果你想学习,选择B)如果你不在乎,只想要一个快速但不一定完美的解决方案 有许多可能的解决方案,其中一些:C++ 二叉树直径的路径,c++,c,binary-tree,C++,C,Binary Tree,我有一个二叉树和一个计算最长路径(直径)大小的方法: 我希望函数也返回确切的路径(直径的所有节点的列表)。 我怎么做 谢谢你有两个选择: A) 想想看。 B) 搜索。在最初几次谷歌点击中,您可以找到以下内容: 选择A)如果你想学习,选择B)如果你不在乎,只想要一个快速但不一定完美的解决方案 有许多可能的解决方案,其中一些: 在分而治之的方法中,您可能最终会在两侧保留到目前为止最长的路径,而只保留较长的路径 引用的解决方案执行两次遍历,一次用于确定直径,另一次用于打印。这是一个很好的技巧,可以克服
在节点结构中添加属性
struct node*next
。在return语句之前,添加这样一行tree->next=(ldiameter>rdiameter?tree->left:tree->right)
将较长的路径节点作为下一个节点。调用diameter(root)
后,您应该能够从根遍历所有下一个节点,以打印最大路径。我认为以下方法可能有效。。。按O(N)时间计算直径,如下所示
在这个函数中,发生了很多事情。第一个最大长度是计算树的最大直径。同时,我将最大直径节点分配给这个节点
这是我将使最大直径通过的节点
现在使用此信息,我们可以找到此节点(max_dia_节点)的最大深度左子节点和右子节点。由此,我们可以通过“父”数组获得实际节点
这是树的两次遍历
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));
}
// 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);
}