您的位置:首页 > 编程语言

【编程题目】求二叉树中节点的最大距离

2014-09-12 19:30 309 查看
第 11 题(树)
求二叉树中节点的最大距离...
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。

思路:二叉树结构中只设了左右子节点的指针。

设单个结点的深度为0。

用后序遍历,得到每个结点为根的子树的最大深度。maxdistance记录该结点(左子树深度+右子树深度 + 2)是否超过已有的最远距离,若超过更新。

关键:空指针的深度设为-1,这样避免了复杂的分类讨论。

树每个结点记录的深度

   (4)

   /

  (3) :举例计算 子树中最大的深度是2,当前结点最大深度是2+1 整棵树最大距离为 1 + 2 + 2 = 5 比已有的

  / \ 整棵树的最大距离大,更新。

   (1) (2)

/ / \

(0) (1) (0)

/

(0) :其左右子树均为空,记其子树的最大深度为-1 当前结点的深度为 -1 + 1 = 0

代码如下:唯一不满意的是maxdistance设为了全局变量,看起来很丑。

/*
第 11 题(树)
求二叉树中节点的最大距离...
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。
start time 16:17
end time 17:20
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct BiTree
{
int data;
BiTree * p_left, * p_right;
}BiTree;

void CreateBiTree(BiTree * &T)
{
int d;
printf("please input data number:");
scanf("%d", &d);
if (d != 0)
{
T = (BiTree *)malloc(sizeof(BiTree));
T->data = d;
T->p_left = NULL;
T->p_right = NULL;
CreateBiTree(T->p_left);
CreateBiTree(T->p_right);
}
}

//递归
int maxdistance = 0;
int  BiTreeMaxDistance(BiTree * T) //利用后序遍历
{
if (T == NULL)
{
return -1;
}
else
{
int l = BiTreeMaxDistance(T->p_left);
int r = BiTreeMaxDistance(T->p_right);
int distance = l + r + 2;
maxdistance = (distance > maxdistance) ? distance : maxdistance;
return (l > r) ? l + 1 : r + 1;
}
}

int main()
{
BiTree * T = NULL;
CreateBiTree(T);
BiTreeMaxDistance(T);

printf("the max distance of the tree is %d.\n", maxdistance);

return 0;
}


网上找答案,发现居然是《编程之美》里的题。然后,书里的代码也用了全局变量...感觉书里的方法没有我的方法简洁,代码也比我的看起来复杂。不过整体思路还是一样的。

又看了几个人的博客,发现有几个和我的思路是一样的。真可谓英雄所见略同啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: