如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义”距离”为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。
思路:
要求相距最远的两个节点之间的距离,我们可以这样考虑:由于只有根节点和子节点之间有相连的边
那么,假设最后结果是A和B有最大距离,那么A的根的根…… 与 B的根的根…… 是同样的一个节点,设为C.
我们知道A、B节点必定是以C为根的左右子树的最大高度,否者,假设存在D到C的高度大于A,那么B、D
的距离才是最大距离。
综上,只需求以每个节点为根的左右子树的高度 的最大值。
#include <iostream>
#include <queue>
using namespace std;
struct BNode
{
int key;
BNode *m_pl,*m_pr;
};
typedef BNode* T;
typedef queue<T> QET;
int MaxDepth;
int Depth(const BNode* head)
{
if ( head == 0 )
return 0;
int l = Depth(head->m_pl) + 1;
int r = Depth(head->m_pr) + 1;
if (l + r > MaxDepth)
MaxDepth = l + r;
return (l > r) ? l : r;
}
int main()
{
QET qe;
BNode *head = 0;
head = new BNode();
cin >> head->key;
head->m_pl = head->m_pr = 0;
qe.push(head);
while ( !qe.empty() )
{
BNode *temp = qe.front();
qe.pop();
cout << temp->key << "的左右子女的关键字,空用-1表示:" << endl;
BNode *l = new BNode();
BNode *r = new BNode();
cin >> l->key >> r->key ;
if (l->key == -1)
delete l;
else
{
l->m_pl = l->m_pr = 0;
temp->m_pl = l;
qe.push(l);
}
if (r->key == -1)
delete r;
else
{
r->m_pl = r->m_pr = 0;
temp->m_pr = r;
qe.push(r);
}
}
Depth(head);
cout << MaxDepth - 2 << endl;
return 0;
}