博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在二进制树中的节点之间的最大距离(最长路径树)——递归解决方案
阅读量:6693 次
发布时间:2019-06-25

本文共 1132 字,大约阅读时间需要 3 分钟。

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

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

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

问题描写叙述:

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

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

                                  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; }

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

你可能感兴趣的文章
【开源】合摩 WeexBox 正式发布
查看>>
原生 js 实现面对对象版瀑布流
查看>>
逝去的2018年,年度总结
查看>>
链客区块链技术面试题目专题(二)
查看>>
你的like语句为啥没索引?
查看>>
PHP中header头设置Cookie与内置setCookie的区别
查看>>
前端下载 图片 总结
查看>>
Vue表单输入绑定
查看>>
LINUX下进程打开的文件怎么和底层磁盘关联的?
查看>>
Java 设计模式之命令模式
查看>>
JavaScript六种非常经典的对象继承方式
查看>>
可能是把Java内存区域讲的最清楚的一篇文章
查看>>
PHP中的几个随机数生成函数
查看>>
Anaconda不同envs的pip和python的版本
查看>>
深度学习与神经网络:最值得关注的6大趋势
查看>>
给SUBVERSION-EDGE和GITLAB-CE增加多LDAP域认证支持的经历
查看>>
SQLServer之创建全文索引
查看>>
如何以并发方式在同一个流上执行多种操作?--复制流
查看>>
Spring Boot 参考指南(开发Web应用程序)
查看>>
策略模式总结
查看>>