算法题——二叉树中结点的最远距离

题目:给定一棵二叉树,结点的距离就是两个结点之间路径包含的结点的数目,求结点的最大距离。

 

可以参考这两篇文章:《编程之美: 求二叉树中节点的最大距离》的另一个解法 和 Tree Diameter

 

思路

在每一个结点处,求两个信息:以该结点为根的树的高度,以及以该结点为根的树中包含的最大距离。

因为所求的最大距离,如果是跨越根结点的,则为两个子树的树高度之和+1,如果是不跨越根结点的,则为左右子树中的最大距离的最大值。

 

代码

①参考第一篇文章,每次返回两个值:

 1 struct TreeNode
 2 {
 3     int val;
 4     TreeNode *left, *right;
 5 };
 6 
 7 //每次返回两个值
 8 struct RetVal
 9 {
10     int height;
11     int max_dist;
12     RetVal(int h, int d): height(h), max_dist(d)
13     {
14     }
15 };
16 
17 RetVal maxDistInTree(TreeNode *root)
18 {
19     if(root == NULL)
20         return RetVal(0, 0);
21 
22     RetVal lcr = maxDistInTree(root->left); //left child result
23     RetVal rcr = maxDistInTree(root->right);
24 
25     RetVal result;
26     result.height   = 1 +  max(lcr.height, rcr.height);
27     result.max_dist = max( max(lcr.max_dist, rcr.max_dist), lcr.height + rcr.height + 1 );
28 
29     return result;
30 }

 

②参考第二篇文章,分别求高度和树直径

 1 //单独求高度和直径(最大距离)
 2 int treeHeight(TreeNode *root)
 3 {
 4     if(root == NULL)
 5     {
 6         return 0;
 7     }
 8     else
 9     {
10         return 1 + max( treeHeight(root->left), treeHeight(root->right) );
11     }
12 }
13 
14 int treeDiam(TreeNode *root)
15 {
16     if(root == NULL)
17         return 0;
18 
19     int l_height = treeHeight(root->left);
20     int r_height = treeHeight(root->right);
21 
22     int l_diam   = treeDiam(root->left);
23     int r_diam   = treeDiam(root->right);
24 
25     return max( max(l_diam, r_diam),
26                 l_height + r_height + 1);
27 }

 

转载于:https://www.cnblogs.com/qieerbushejinshikelou/p/3939507.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值