题目:
如果我们把二叉树看成一个图,父子结点之间的连线看成是双向的,我们姑且定义“距离”为两结点之间边的个数。
写一个程序求一棵二叉树中两个结点之间的距离。
思路:
求两个结点之间的最大距离,可以分为两种情况:
第一、两个结点经过了根结点。
第二、两个结点不经过根结点。
总结就是,我们可以求出每个结点的左右高度,那么经过该结点最长路径就是:左子树高度+右子树高度。
最后找出所有结点对应的最长路径的最大值就是我们需要的。
实现如下:
#include <iostream>
using namespace std;
struct Node{
int val;
Node *left;
Node *right;
Node(int _val) :val(_val), left(NULL), right(NULL){}
};
int GetMaxLength(Node *root, int &max)
{
if (root == NULL) return 0;
int leftHeight = GetMaxLength(root->left, max);
int rightHeight = GetMaxLength(root->right, max);
if (max < (leftHeight + rightHeight)) max = leftHeight + rightHeight;
return (leftHeight>rightHeight ? leftHeight : rightHeight) + 1;
}
int main()
{
int max = 0;
Node *n1 = new Node(1);
Node *n2 = new Node(2);
Node *n3 = new Node(3);
Node *n4 = new Node(4);
Node *n5 = new Node(5);
Node *n6 = new Node(6);
Node *n7 = new Node(7);
Node *n8 = new Node(8);
Node *n9 = new Node(9);
n1->left = n2;
n1->right = n3;
n2->left = n4;
n2->right = n5;
n4->left = n6;
n6->left = n7;
n5->left = n8;
n8->left = n9;
cout<<GetMaxLength(n1, max)<<endl;
cout << max << endl;
}