我有一个二叉树和一个最长路径大小的方法(直径):
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));
}
我希望函数也返回确切的路径(直径的所有节点的列表)。 我该怎么办?
由于
答案 0 :(得分:0)
您有两种选择: A)想一想。 B)搜索。在最初的几次谷歌搜索中你可以找到:http://login2win.blogspot.hu/2012/07/print-longest-path-in-binary-tree.html
选择A)如果你想学习,选择B)如果你不在乎,只需要一个快速的,尽管不一定完美的解决方案。
有许多可能的解决方案,其中一些:
答案 1 :(得分:0)
将属性struct node * next
添加到节点结构中。在return语句之前,添加一行,如tree->next = (ldiameter > rdiameter ? tree->left : tree->right)
,以获取较长的路径节点作为下一个节点。在调用diameter(root)
之后,您应该能够遍历根目录中的所有下一个节点以打印最大路径。
答案 2 :(得分:0)
我认为以下内容可能有效...在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)。从那里我们可以通过“父”数组获得实际节点。
这是树的两次遍历。