Programe_Of_Beauty:3.8 求二叉树中节点的最大距离
2011-05-28 19:15 x_feng 阅读(257) 评论(0) 收藏 举报1.问题定义
定义距离为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。下面是两个例子:
上图中列出了二叉树中节点间距离最大的所有可能情况。箭头所指的边标示了A、B之间最大的距离。
2.问题分析
从上图中可以看出,距离最远的两个点一定有一个共同的“根”节点,或者其中一个就是根节点(注意前者的“根”与后者的根的区别,前者的“根”包含后者)。因此只要能计算出所有“根”的左子树的最深长度和右子树的最深长度,就可以知道经过此“根”节点的所有路径中的最大距离。通俗的讲,就是计算任意一个节点的左右子树的最深长度。
3.递归算法
树节点的结构体定义:
struct _Node
{
_Node * Lchild;
_Node * Rchild;
int data;
};
定义一个全局变量,用来记录访问过的所有节点中的最大距离。
int MMax = 0;
生成二叉树:
void HCreateTree()
{
_NNode * root = new _NNode[9];
for (int i = 0; i <9; i ++)
{
root[i].data = i;
root[i].Lchild = NULL;
root[i].Rchild = NULL;
}
root[0].Lchild = &root[1];
root[0].Rchild = &root[2];
root[2].Lchild = &root[3];
root[2].Rchild = &root[6];
root[3].Lchild = &root[4];
root[4].Lchild = &root[5];
root[6].Rchild = &root[7];
root[7].Rchild = &root[8];
FindMaxLen(root);//计算最大距离的函数
cout<<"MMax="<<MMax<<endl;
delete[] root;
}
int FindMaxLen(_Node *root)
{
if (root)
{
int i = FindMaxLen(root->Lchild);//返回当前节点root左子树的最深长度
int j = FindMaxLen(root->Rchild);//返回当前节点root右子树的最深长度
if ( (i + j) > MMax)//更新MMax
{
MMax = i + j;
}
if (i > j)
return i + 1;
else
return j + 1;
}
return 0;
}
输出结果为6。当然你也可以参考《编程之美》3.8关于这个问题的求解。


浙公网安备 33010602011771号