• 在二进制树中的节点之间的最大距离(最长路径树)——递归解决方案


    上一篇文章即是对这一主题的变化。并给出了一个非递归溶液。

    我给出原题的一种递归解法

    将会看到,现比較上篇博文。今天给出的递归解法的代码实现是相当简洁的。


    问题描写叙述:

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

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

                                      n1

                                 /            

                              n2             n3

                           /        

                       n4          n5

                     /             /  

                  n6    n7    n8    n9

                 /                       /

             n10                 n11

    算法:

    上篇博文我们用到了树的深度depth。

    而在递归解决此题的思考中。我发现用树的高度要比用深度简便得多。

    这是由于:对于一个叶节点,它子树(虽然没有)的高度能够觉得是0,它自己的高度是1,非常easy区分。若是用深度。则都是0,会带来一些繁琐的推断。

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

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

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

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

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

                                                                                   ——结论1

    代码实现:

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

    。)

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

    节点:

    //节点结构体
    struct BinaryTreeNode
    {
    	BinaryTreeNode* left = NULL;
    	BinaryTreeNode* right = NULL;
    	int floor = 1;
    };

    关键代码:

    //查找最大路径。返回路径长度
    int FindMaxPath(BinaryTreeNode* t)
    {
    	if (t)
    	{
    		int lpath = FindMaxPath(t->left);//左子树最大路径
    		int rpath = FindMaxPath(t->right);//右子树最大路径
    		//t做根的树的层数等于子树最大层数+1
    		t->floor = max2((t->left) ? t->left->floor : 0, (t->right) ? t->right->floor : 0) + 1;
    		//结论1
    		return max3(lpath, rpath, ((t->left) ? t->left->floor : 0) + ((t->right) ?

    t->right->floor : 0) ); } return 0; }


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    GitLab 内存使用优化
    记一次 GitLab 的迁移过程
    MAC 最全快捷键
    IDEA中通过Java调用Python脚本报错
    远程服务调用PRC发展史
    分布式&微服务传送门
    (11)MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)
    不懂物理的前端不是好的游戏开发者(一)—— 物理引擎基础
    京东购物小程序 | Taro3 项目分包实践
    浅谈树模型与集成学习-从决策树到GBDT
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4647589.html
Copyright © 2020-2023  润新知