博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Programe_Of_Beauty:3.8 求二叉树中节点的最大距离
阅读量:5060 次
发布时间:2019-06-12

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

1.问题定义

定义距离为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。下面是两个例子:

上图中列出了二叉树中节点间距离最大的所有可能情况。箭头所指的边标示了A、B之间最大的距离。

2.问题分析

从上图中可以看出,距离最远的两个点一定有一个共同的“根”节点,或者其中一个就是根节点(注意前者的“根”与后者的根的区别,前者的“根”包含后者)。因此只要能计算出所有“根”的左子树的最深长度和右子树的最深长度,就可以知道经过此“根”节点的所有路径中的最大距离。通俗的讲,就是计算任意一个节点的左右子树的最深长度。

3.递归算法

树节点的结构体定义:

struct _Node{	_Node * Lchild;	_Node * Rchild;	int     data;};

定义一个全局变量,用来记录访问过的所有节点中的最大距离。

int MMax = 0;

生成二叉树:

void HCreateTree(){	_NNode * root = new _NNode[9];	for (int i = 0; i <9; i ++)	{		root[i].data = i;		root[i].Lchild = NULL;		root[i].Rchild = NULL;	}	root[0].Lchild = &root[1];	root[0].Rchild = &root[2];	root[2].Lchild = &root[3];	root[2].Rchild = &root[6];	root[3].Lchild = &root[4];	root[4].Lchild = &root[5];	root[6].Rchild = &root[7];	root[7].Rchild = &root[8];        FindMaxLen(root);//计算最大距离的函数	cout<<"MMax="<
<

上面代码构造的二叉树如图所示。

int FindMaxLen(_Node *root){	if (root)	{		int i = FindMaxLen(root->Lchild);//返回当前节点root左子树的最深长度		int j = FindMaxLen(root->Rchild);//返回当前节点root右子树的最深长度		if ( (i + j) > MMax)//更新MMax                   {			MMax = i + j;                   }		if (i > j)			return i + 1;		else			return j + 1;	}	return 0;}

输出结果为6。当然你也可以参考《编程之美》3.8关于这个问题的求解。

转载于:https://www.cnblogs.com/cluster/archive/2011/05/28/2060984.html

你可能感兴趣的文章
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
多服务器操作利器 - Polysh
查看>>
[LeetCode] Candy
查看>>
Jmeter学习系列----3 配置元件之计数器
查看>>
jQuery 自定义函数
查看>>
jq 杂
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
作业一
查看>>
AJAX
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
Leetcode(7)-反转整数
查看>>
堆栈的分配效率问题
查看>>
特征选取1-from sklearn.feature_selection import SelectKBest
查看>>
python机器学习-sklearn挖掘乳腺癌细胞(一)
查看>>
队列实现
查看>>
node04-buffer
查看>>
来看看css3中的box-shadow
查看>>