二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法。

现在我给出原题的一种递归解法。将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的。

问题描述:

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

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

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的左右子树的高度已知,它们由前两行递归代码已经顺带求出。因此顺序不能更改!!

节点:

//节点结构体
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;
}
时间: 2024-10-19 02:13:02

二叉树中节点的最大距离(树的最长路径)——递归解法的相关文章

IT公司100题-11-求二叉树中节点的最大距离

问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/     \6      14/   \   /   \4    8 12    16 分析: 二叉树中最远的两个节点,要么是根和一个叶子节点,要么是两个叶子节点. 代码实现: 1 // 11.cc 2 #include <iostream> 3 using namespace std; 4 5 typedef struct BSTreeNode { 6 int data; 7 BSTreeNode *left; 8 BS

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

第 11 题(树)求二叉树中节点的最大距离...如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离. 思路:二叉树结构中只设了左右子节点的指针. 设单个结点的深度为0. 用后序遍历,得到每个结点为根的子树的最大深度.maxdistance记录该结点(左子树深度+右子树深度 + 2)是否超过已有的最远距离,若超过更新. 关键:空指针的深度设为-1,这样避免了复杂的分类讨论. 树每个结

11求二叉树中节点的最大距离

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253605.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:如果我们把二叉树看成一个图,一棵树显示是一颗有向无环图,定义"距离"为两节点之间边的个数(不考虑方向).写一个程序,求一棵二叉树中相距最远的两个节点

编程之美之求二叉树中节点的最大距离

题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 分析:树上分析的很清楚,计算一个二叉树的最大距离有两个情况: 1. 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 2. 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 但是树上的代码使用了额外的节点字段,这里给出我的代码,思路是一样的: struct BinaryTree { int valu

11.求二叉树中节点的最大距离

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义 " 距离 " 为两节点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离,求二叉树中节点的最大距离 分析: 先画几个不同形状的二叉树,从例子中可以看出,相距最远的两个节点,一定是两个叶子节点,或者是一个叶子节点到它的根节点: 根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论. 对于任意一个节点,以该节点为根,假设这个根有 K 个孩子节点,那么相距最远的两 个节点 U和 V之间的路

变形二叉树中节点的最大距离(树的最长路径)——非递归解法

问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \         /   \ n6    n7    n8    n9 /                       / n10                

3.8 求二叉树中节点的最大距离

题目: 把二叉树看成一个图,父子节点之间的连线看成是双向的,定义"距离"为两个节点之间的边数. 求一颗二叉树中的两个节点之间的距离的最大值. 方法一:用书上写的方法: 代码: struct node { node *left; node *right; int nMaxLeft; int nMaxRight; char ch; }; int nMaxLength = 0; void FindMaxDistance(node *root) { if(root == NULL) retur

第11题:求二叉树中节点的最大距离

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44984331 第11题:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离. 树的高度是一个重要信息,然后就可以祭出递归大法了. 代码 package test011; import test004.Node; /** * Created by cq o

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

如果我们把二叉树视为一个图,父子节点之间的连线视为双向的,我们姑且定义为“举例”为两节点之间边的个数.写一个程序求一颗二叉树中相距最远的两个节点之间的距离(<编程之美>3.8) 思路:如果两个节点相距最远,一定是两个叶子节点,或者是一个叶子节点到它的根节点. 根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论.    对于任意一个节点,以该节点为根,假设这个根youk个孩子节点,那么相距最远的两个节点U和V之间的路径与这个根节点的关系有两种情况. 1.若路径经过根Root,则U和