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

问题 E: DS二叉树—二叉树结点的最大距离 题目描述 二叉树两个结点的距离是一个结点经过双亲结点,祖先结点等中间结点到达另一个结点经过的分支数。二叉树结点的最大距离是所有结点间距离的最大值。例如,下图所示二叉树结点最大距离是3,C和D的距离。 二叉树用先序遍历顺序创建,#表示空树。计算二叉树结点最大距离和最大距离的两个结点(假设二叉树中取最大距离的两个结点唯一)。 输入 测试次数T 第2行之后的T行,每行为一棵二叉树先序遍历结果(#表示空树) 输出 对每棵二叉树,输出树的结点最大距离和最大距离... 阅读详情

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

问题:如果把二叉树看成一个图,并且父子结点之间的连线看成是双向的,姑且定义“距离”为两个结点之间边的个数,求一棵二叉树中相距最远的两个结点之间的距离。

解法一:详见《编程之美》3.8以及代码。

代码一:

typedef struct BinTreeNode
{
	char data;
	int nMaxLeft;
	int nMaxRight;
	BinTreeNode *lchild,*rchild;
};
/*------------------------------------------------------------------------*/ 
void FindMaxDist(BinTreeNode *pRoot)
{
	if (pRoot == NULL) {
		return;
	}
	
	if (pRoot->lchild == NULL) {
		pRoot->nMaxLeft = 0;
	}
	if (pRoot->rchild == NULL) {
		pRoot->nMaxRight = 0;
	}
	
	if (pRoot->lchild != NULL) {
		FindMaxDist(pRoot->lchild);
	}
	if (pRoot->rchild != NULL) {
		FindMaxDist(pRoot->rchild);
	}
	
	if (pRoot->lchild != NULL) {
		int nTempMax = 0;
		if (pRoot->lchild->nMaxLeft > pRoot->lchild->nMaxRight) {
			nTempMax = pRoot->lchild->nMaxLeft;
		}
		else {
			nTempMax = pRoot->lchild->nMaxRight;
		}
		pRoot->nMaxLeft = nTempMax + 1;
	}
	if (pRoot->rchild != NULL) {
		int nTempMax = 0;
		if (pRoot->rchild->nMaxLeft > pRoot->rchild->nMaxRight) {
			nTempMax = pRoot->rchild->nMaxLeft;
		}
		else {
			nTempMax = pRoot->rchild->nMaxRight; 
		}
		pRoot->nMaxRight = nTempMax + 1;
	}
	
	if (pRoot->nMaxLeft + pRoot->nMaxRight > nMaxLen) {
		nMaxLen = pRoot->nMaxLeft + pRoot->nMaxRight; 
	}
}

/*-------------------------------------------------------------------------*/

解法二:使用最基本的二叉树结点的定义,详见《 [编程之美]求二叉树中节点的最大距离》。

代码二:

#include <stdio.h>
#include <stdlib.h>
#include <stack>
using namespace std;

typedef struct BinTreeNode * BinTree;
typedef struct BinTreeNode 
{
	char data;
	BinTreeNode *lchild,*rchild;	
};


int MaxDistanceBetweenNodes(BinTreeNode *pRoot,int *pmax)
{
	// return 0 if leaf node
	if (pRoot->lchild == NULL && pRoot->rchild == NULL) {
		return 0;
	}
	
	// depth of two sub-trees
	int ldepth = 0;
	int rdepth = 0;
	
	if (pRoot->lchild != NULL) {
		ldepth = 1 + MaxDistanceBetweenNodes(pRoot->lchild,pmax);
	}
	if (pRoot->rchild != NULL) {
		rdepth = 1 + MaxDistanceBetweenNodes(pRoot->rchild,pmax);
	} 
	
	if (ldepth + rdepth > *pmax) {
		*pmax = ldepth + rdepth;
	}
	
	return ldepth > rdepth ? ldepth : rdepth;
}

int MaxDistanceInBinTree(BinTreeNode *pRoot,int *pmax)
{
	if (pRoot == NULL || pmax == NULL) {
		return -1;
	}
	*pmax = 0;
	return MaxDistanceBetweenNodes(pRoot,pmax);
}

void buildBinTree(BinTree *T,char *str)
{
	stack<BinTree> s;
	*T = NULL;
	BinTree p,t;
	p = t = NULL;
	int i,k;
	i = 0;
	while(str[i])
	{
		switch(str[i]){
			case '(': s.push(p); k = 1; break;
			case ')': t = s.top(); s.pop(); break;
			case ',': k = 2; break;
			default:
				p = new BinTreeNode;
				p->data = str[i];
				p->lchild = p->rchild = NULL;
				if (*T == NULL){
					*T = p;
				}
				else if (k == 1){
					t = s.top();
					t->lchild = p;					
				}
				else {
					t = s.top();
					t->rchild = p;
				}
		}
		i++;
	}
}

int main()
{
	BinTree T;
	char *t = "A(B(C,D),E(F,))";
	buildBinTree(&T,t);
	int *pmax = (int *)malloc(sizeof(int));
	printf("Max Distance : %d %d.\n",*pmax,MaxDistanceInBinTree(T,pmax));
	free(pmax);
}

测试输出:

Max Distance : 4 2.

REF:

1,《编程之美》 3.8 求二叉树中结点的最大距离

2,http://blog.youkuaiyun.com/lalor/article/details/7626678

求二叉树中节点的最大距离(递归算法) <br />上一篇的《求二叉树中节点的最大距离 》显得有点走火入魔了,参考过别人的算法解释,事实上不需要考虑得那么复杂。使用以下C代码就可以解决了。<br /><br />/* * return the depth of the tree */ int get_depth(Tree *tree) { int depth = 0; if ( tree ) { int a = get_depth(tree->left); int b = get_depth 阅读详情

相关推荐

求二叉树中节点间的最大距离(c++代码完整实现)

//求一个二叉树中节点间的最大距离, //两个节点的距离定义是这两个节点间的边的个数 //比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间复杂度 #include #include #define OVERFLOW -2 using namespace std; // 数据结构定义 struct NODE { NODE* pLeft; /

日新为道的专栏 1732

DS二叉树—二叉树结点的最大距离

二叉树两个结点的距离是一个结点经过双亲结点,祖先结点等中间结点到达另一个结点经过的分支数。二叉树结点的最大距离是所有结点间距离的最大值。例如,下图所示二叉树结点最大距离是3,C和D的距离。找最大距离:先写一个求树高的函数,然后遍历所有结点,找到结点左右子树的树高之和的最大值,即为最大的距离,保存这个最大距离为max和这个结点为maxNode。计算二叉树结点最大距离和最大距离的两个结点(假设二叉树中取最大距离的两个结点唯一)。对每棵二叉树,输出树的结点最大距离和最大距离的结点,输出格式见样例。

m0_64068846的博客 1918

求一个点到任意两个点所在直线距离 C#代码公式

求点C(X0,Y0) 到点A(x1,y1)和点B(x2,y2)所在直线的距离 1.已知任意两个点,求这两个点所在直线 已知点A(x1,y1),点B(x2,y2) 设直线上另外任意一个点为(x,y) 那么 (x-x1)/(y-y1) = (x2-x1)/(y2-y1); 整理后得方程: (y2-y1)x + (x1-x2)y + (y1-...

qq_29434987的博客 4492

E. DS二叉树—二叉树结点的最大距离

写一个函数,能找出该节点往下的层数最多是多少 然后遍历,对节点的左右节点往下的层数分别最多是多少,加起来 然后找出最多的那个 这里容易知道对应的俩个点都是子叶 不一定中间节点在头节点,比如样例的第三个, 这个用来记录层数和子叶的数据,找到子叶然后返回一个Date 类 到底了返回数值0 ,从子叶开始向上返回每次加一后的值,和子叶的数据 遍历,每个节点都找左右然后加起来和longest比较,如果比他大,那需要 改longest,和最远距离对应的那对 #in...

weixin_52247921的博客 1681

麒麟linux离线源码编译安装zabbix-agent

离线源码编译安装zabbix-agent

qq_37263429的博客 2268

Apache Doris IP变更问题详解

Apache Doris IP变更问题详解

ith321的博客 7274

二叉树中结点的最大距离

问题:结点的距离指这两个结点之间边的个数。求一棵二叉树中相距最远的两个结点之间的距离。 思路:首先,求左子树距离根结点的最大距离,记为leftMaxDistance,其次,求右子树距离根结点的最大距离,记为rightMaxDistance,那么二叉树中结点的最大距离maxDistance满足maxDistance=leftMaxDistance+rightMaxDistance. pack

wuxiaosi808的博客 893

Colmap参数调优实战:如何通过5个关键设置提升3D重建精度

本文深入探讨Colmap参数调优实战,通过5个关键设置显著提升3D重建精度。重点解析特征匹配参数、BA优化配置、初始化策略、资源分配及动态调整方法,结合量化数据和实际案例,帮助开发者精准优化重建流程,适用于古建筑扫描、无人机航拍等多种场景。

weixin_30872157的博客 432

求二叉树中,任意两个节点之间的距离最大值是多少

1)二叉树的动态规划DP递归套路,要熟练掌握,上面有系列文章,看它2个例子就明白了 2)二叉树的树形DP递归套路,往往要分析与x节点有关,还是与x节点无关,才能整理出信息来。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 2354

【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程

这章来学习串口数据流操作。仿照成品制作一个自己用Qt编写的串口助手。 1. 布局UI界面 创建QWidget工程,布局UI界面:拖入2个 Plain Text Edit,作为串口数据的接收显示和发送框。 拖入几个 Combo Box 、Label 和 Push Button,使用两个Widget进行布局。如下所示。 将接收区的 Plain Text Edit,属性勾选上 readOnly,使其运行时不会被人为的输入操作影响。 加入一些弹簧,使布局美观。(有必要可以加设置不能调整..

Mark_md的博客 9274

vscode的launch:program ‘‘ does not exist

如图 一般是由于launch.json文件没有配置好的缘故。在右下角的ADD configuration如选第二个登录: 看到program这一栏,这一栏很重要,一般是选择你CMakelist,编译出来的可执行文件 看我CMakelist, 我生成的可执行文件是test_,所以路径可以这样输入: 我在之前cmake的时候已经有了test_这个文件了 然后就可以运...

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 5万+

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

package com.java.ly2011.bczm;/** * 在一个二叉树中求两个节点的最大距离 *  * 设树的节点R. 以R节点为跟结点的子树最大距离的两个节点可能为以下三种情况: * 1  1个节点在当前跟节点左子树,另一个在右子树 * 2  两

531

MaxScript批量修改材质、贴图名称

MaxScript批量修改材质、贴图名称1 实现效果1.1 修改前材质、贴图名称1.2 修改后2 代码 1 实现效果 1.1 修改前材质、贴图名称 1.2 修改后 2 代码 prefixName = "prefiname" maxFile = "maxfilepath" makeDir "newBitmappath" mapsPath = newbitmappath + "\\" fn formatStr index = ( str = index as string newS

郑德帅 3241

关于二叉树,建立、遍历、求节点最大距离

今天做了一题求二叉树节点的最大距离,顺便写了下二叉树的建立,遍历的过程。  我觉得这题的主要思想是深度遍历+动态规划,我们在深度遍历的过程中,对于某一个子树,求出左右子树叶子节点到根节点的最大距离,进而求出经过根节点的最大距离。 最后求出所有子树经过根节点的最大距离。就是这个题目的最终结果。代码如下:  //二叉树的建立,以及遍历 //16 14 8 2 -1 -1 4 -1 -1 7 1 -

King__Moving的专栏 803

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【二叉树】求二叉树上节点间的最大距离

题目 从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫作A到B的距离。对于给定的一棵二叉树,求整棵树上节点间的最大距离。给定一个二叉树的头结点root,请返回最大距离。保证点数大于等于2小于等于500. 思路 如中节点4和节点2之间的距离为2,节点2和5之间的距离为3. 设二叉树的头节点为head,这棵树的节点间最大距离可从以下三种情况中...

gulaixiangjuejue的博客 920

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

二叉树节点的结构体定义如下: struct BTreeNode {  ElemType elem;  // 当前节点元素  BTreeNode *left; // 左孩子结点  BTreeNode *right; // 右孩子节点  int maxLeft;  //

tangbo1987的专栏 890

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

题目: 如果我们把二叉树看成一个图, 父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数。 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离。 参考:http://www.cnblogs.com/miloyip/archive/2010/02/25/1673114.html 分析: 书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆

zwb8848happy的专栏 520
上一篇: 计算字符串的相似度
下一篇: C语言string.h中常用函数详解
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值