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

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

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

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

问题描写叙述:

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

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

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

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

时间: 2024-10-14 00:40:58

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

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

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

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

#include<iostream> using namespace std; //二叉树 节点结构 typedef struct TNODE_ { int data; struct TNODE_*left; struct TNODE_*right; }TNode; //获取树的高度=路径+1(最长路径经过的边数+1) int GetLRDistance(TNode*t) { int len=0; if(t==NULL) { return 0; }else{ int lenL=GetLRDis

hiho #1050 : 树中的最长路 树的直径

#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已. 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =).小Ho手中的这棵玩具树现在由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不

hdu3534 树形dp(求树中两点之间的最大距离)

http://acm.hdu.edu.cn/showproblem.php?pid=3534 Problem Description In the Data structure class of HEU, the teacher asks one problem: How to find the longest path of one tree and the number of such longest path? Input There are several test cases. The

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

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

Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建

提到中断就必须了解到GIC,下面先了解一下GIC 一.GIC概念  GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器.GIC通过AMBA(Advanced Microcontroller Bus Architecture)这样的片上总线连接到一个或者多个ARM processor上. 下面是Exynos4412-fs4412 开发板(内核版本为 Linux 3.14)的中断源连线: 二.设备树中中断如何工作 与遵循树的自然结构而进行的地址转

STM32W108无线射频模块两节点之间通信实例

本文基于802.15.4/ZigBee的SimpleMac协议栈编写程序,实现两个STM32W108无线节点之间的通信.节点分为SUN节点和PLANET节点,SUN节点使用STM32W108无线开发板,PLANET节点使用STM32W108无线节点,SUN节点可与PC机进行通信. 程序设计与实现 程序的设计基于SimpleMac协议栈进行,根据官方提供的MAC协议栈示例代码进行的裁剪更改,第10章已对协议栈代码进行了解析,在此就不详细说明,以下只给出部分主要相关代码. 文件solar-syste

STM32W108无线射频模块多节点之间通信实例

STM32W108无线射频模块多节点之间通信实例 基于STM32W108的SimpleMac协议栈编写程序,实现多个无线节点之间的通信.节点分为SUN节点和PLANET节点,SUN节点使用STM32W108无线开发板,PLANET节点使用STM32W108无线数据采集节点,SUN节点可与PC机进行通信. 编程与实现 程序的设计基于SimpleMac协议栈进行,以下给出部分主要相关代码.该实例中的部分代码与第11章中的两节点通信实例代码相同,本章不再重复说明. 文件solar-system.c部分

文件描述符、文件描述符表、打开文件表、目录项、索引节点之间的联系

文件描述符.文件描述符表.打开文件表.目录项.索引节点之间的联系如下图所示: 每个进程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体. 在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos).在上图中,进程1和进程2都打开同一文件,