树的最长路径

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37947204/article/details/81530839

问题描述:

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义”距离”为两节点之间边的个数。

 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。测试用的树:

                                  n1

                             /             \

                          n2             n3

                       /        \

                   n4          n5

                 /     \         /   \

              n6    n7    n8    n9

             /                       /

         n10                 n11

算法:

上篇博文我们用到了树的深度depth。而在递归解决此题的思考中,我发现用树的高度要比用深度简便得多。

这是因为:对于一个叶节点,它子树(尽管没有)的高度可以认为是0,它自己的高度是1,很容易区分。若是用深度,则都是0,会带来一些繁琐的判断。

题目就是求一棵树中的最长路径

对于节点t,以它为根的树的最长路径path一定是下列三个数中的最大值

①t的左子树的最长路径lpath

②t的右子树的最长路径rpath

③t的左子树的高度+t的右子树的高度

                                                                               ——结论1

代码实现:

为了简洁优美,我尽量简化了代码,可能牺牲了一点易读性、增加了一些操作(如强行拼出来的那一长串return语句。。)

值得注意的是,程序中代码的顺序不能改变,因为对t->floor赋值的前提是t的左右子树的高度已知,它们由前两行递归代码已经顺带求出。因此顺序不能更改!!

节点:

  1. //节点结构体
  2. struct BinaryTreeNode
  3. {
  4. BinaryTreeNode* left = NULL;
  5. BinaryTreeNode* right = NULL;
  6. int floor = 1;
  7. };

关键代码:

  1. //查找最大路径,返回路径长度
  2. int FindMaxPath(BinaryTreeNode* t)
  3. {
  4. if (t)
  5. {
  6. int lpath = FindMaxPath(t->left);//左子树最大路径
  7. int rpath = FindMaxPath(t->right);//右子树最大路径
  8. //t做根的树的层数等于子树最大层数+1
  9. t->floor = max2((t->left) ? t->left->floor : 0, (t->right) ? t->right->floor : 0) + 1;
  10. //结论1
  11. return max3(lpath, rpath, ((t->left) ? t->left->floor : 0) + ((t->right) ? t->right->floor : 0) );
  12. }
  13. return 0;
  14. }

展开阅读全文

没有更多推荐了,返回首页