如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。
这里可以求节点的左右子树的高度,然后可以得到一该几点为根的最长路径。遍历书的每一个节点,并在遍历过程中用n记录最大值!
#include <iostream>
using namespace std;
struct BSTreeNode
{
int m_nHeight; //存储数高度
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
BSTreeNode();
BSTreeNode(int value);
};
void insert(BSTreeNode** root,int n); //出入元素
int getheight(BSTreeNode* root,int &n); //获得数的高度
int main()
{
int n = 0 ;
BSTreeNode* root = NULL;
insert(&root,10);
insert(&root,6);
insert(&root,15);
insert(&root,4);
insert(&root,9);
insert(&root,5);
insert(&root,7);
insert(&root,8);
insert(&root,14);
insert(&root,13);
insert(&root,12);
getheight(root,n);
cout<<n;
system("pause");
return 0;
}
int getheight(BSTreeNode* root,int &n)
{
int left;
int right;
if (root->m_pLeft == NULL)
left = 0 ;
else
left = getheight(root->m_pLeft,n);
if (root->m_pRight == NULL)
right = 0 ;
else
right = getheight(root->m_pRight,n);
if (left+right > n)
n = left + right ;
if (left>right)
return left+1;
else return right+1;
}
void insert(BSTreeNode** root,int n)
{
BSTreeNode* temp = new BSTreeNode;
BSTreeNode* current ;
temp->m_nValue = n ;
temp->m_pLeft = NULL ;
temp->m_pRight = NULL ;
if (*root == NULL)
{
*root = new BSTreeNode(n);
}
else
{
current = *root ;
while(current != NULL)
{
if (current->m_nValue>n&¤t->m_pLeft==NULL)
{
current->m_pLeft = temp ;
break;
}
else if (current->m_nValue>n&¤t->m_pLeft!=NULL)
{
current = current->m_pLeft;
continue;
}
else if (current->m_nValue<n&¤t->m_pRight==NULL)
{
current->m_pRight = temp;
break;
}
else if (current->m_nValue<n&¤t->m_pRight!=NULL)
{
current = current->m_pRight;
continue;
}
}
}
}
BSTreeNode::BSTreeNode(int value)
{
m_nValue = value ;
m_pLeft = NULL ;
m_pRight = NULL ;
}
BSTreeNode::BSTreeNode()
{}