在二叉树中找到两个最远的元素

时间:2010-03-15 10:44:08

标签: algorithm language-agnostic binary-tree

我正在寻找一种算法,它可以在二叉树中找到两个最远的元素,而不是寻找任何特殊语言,仅用于算法。

感谢。

3 个答案:

答案 0 :(得分:10)

它被称为树的直径

int diameter(Tree * t) // post: return diameter of t 
{ 
     if (t == 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));
 } 

alt text http://www.cs.duke.edu/courses/spring00/cps100/assign/trees/diameter.jpg

copied code and images from here

答案 1 :(得分:4)

您要找的是graph diameter。为了获得它,你需要计算从任何顶点到任何其他顶点的路径,然后遍历所有顶点并找到最大的顶点。
这可以使用Dijkstra's algorithm或简单地distance matrix(可以通过为adjacency matrix提供电源来实现)来实现,尽管它需要比Dijkstra算法更多的时间。

答案 2 :(得分:1)

由于这是一棵树,因此在任何一对顶点之间只有一条路径。这使我们更容易找到图表的直径。

最简单的方法是对树进行两次简单的遍历。首先,将任意节点作为根,并使用简单的DFS / BFS计算每个顶点与它的距离。现在,取最远离根的节点(这是最远对的第一个节点),并使其成为新的根,从那里运行树计算距离的另一次遍历。距离最远的节点是该对中的另一个节点。

证明这有效的原因留作练习。

还有另一种通过计算和比较树的每个子树的最远对来计算最远对的方法,从任意节点开始作为根(在另一个答案中已经提到)。