编程之美读书笔记-求二叉树中节点的最大距离

原创 2016年08月30日 19:57:03

题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义距离为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。如图所示,粗箭头的边表示最长距离。


解析:计算一个二叉树的最大距离有两个情况。
情况A:路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。
情况B:路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者。


只需要计算这两个情况的路径距离,并取其大者,就是该二叉树的最大距离。

#include<iostream>  
using namespace std; 

struct NODE
{
	NODE* pLeft;        // 左子树
	NODE* pRight;       // 右子树
	int nMaxLeft;       // 左子树中的最长距离
	int nMaxRight;      // 右子树中的最长距离
	char chValue;       // 该节点的值
};

int nMaxLen = 0;

// 寻找树中最长的两段距离
void FindMaxLen(NODE* pRoot)
{
	// 遍历到叶子节点,返回
	if (pRoot == NULL)
	{
		return;
	}

	// 如果左子树为空,那么该节点的左边最长距离为0
	if (pRoot->pLeft == NULL)
	{
		pRoot->nMaxLeft = 0;
	}

	// 如果右子树为空,那么该节点的右边最长距离为0
	if (pRoot->pRight == NULL)
	{
		pRoot->nMaxRight = 0;
	}

	// 如果左子树不为空,递归寻找左子树最长距离
	if (pRoot->pLeft != NULL)
	{
		FindMaxLen(pRoot->pLeft);
	}

	// 如果右子树不为空,递归寻找右子树最长距离
	if (pRoot->pRight != NULL)
	{
		FindMaxLen(pRoot->pRight);
	}

	// 计算左子树最长节点距离
	if (pRoot->pLeft != NULL)
	{
		int nTempMax = 0;
		if (pRoot->pLeft->nMaxLeft > pRoot->pLeft->nMaxRight)
		{
			nTempMax = pRoot->pLeft->nMaxLeft;
		}
		else
		{
			nTempMax = pRoot->pLeft->nMaxRight;
		}
		pRoot->nMaxLeft = nTempMax + 1;
	}

	// 计算右子树最长节点距离
	if (pRoot->pRight != NULL)
	{
		int nTempMax = 0;
		if (pRoot->pRight->nMaxLeft > pRoot->pRight->nMaxRight)
		{
			nTempMax = pRoot->pRight->nMaxLeft;
		}
		else
		{
			nTempMax = pRoot->pRight->nMaxRight;
		}
		pRoot->nMaxRight = nTempMax + 1;
	}

	// 更新最长距离
	if (pRoot->nMaxLeft + pRoot->nMaxRight > nMaxLen)
	{
		nMaxLen = pRoot->nMaxLeft + pRoot->nMaxRight;
	}

}

void Link(NODE* nodes, int parent, int left, int right)
{
	if (left != -1)
		nodes[parent].pLeft = &nodes[left];
	if (right != -1)
		nodes[parent].pRight = &nodes[right];
}

int main() 
{
	NODE nodes[10] = { 0 };
	Link(nodes, 1, -1, 2);
	Link(nodes, 2, 3, 4);
	Link(nodes, 3, 5, -1);
	Link(nodes, 4, 6, 7);
	Link(nodes, 5, 8, -1);
	Link(nodes, 6, -1, 9);
	NODE* pRoot = NULL;
	FindMaxLen(&nodes[1]);
	cout << nMaxLen << endl;
	return 0;
}


版权声明:

相关文章推荐

《编程之美》读书笔记12: 3.8 求二叉树中节点的最大距离

问题: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。   实际上就是求树的直径。若...

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

以下代码已经调试通过,其中涉及到一些细节的注释,是自己在写程序曾经出现错误的地方,引以为戒!看下注释能了解到自己曾经在哪里出过错。 尤其是getMaximunDistance()方法中做的注释对自己还...

《编程之美: 求二叉树中节点的最大距离》的另一个解法

12 0 (请您对文章做出评价) Spiga Posts - 23, Articles - 0, Comments - 1089 CnblogsDashboa...

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

问题描述:如果把二叉树看成一个图,父子节点之间的连线看成双向的,定义“距离”为两个节点之间边的个数。求二叉树中相距最远的两个节点的距离。思路:相距最远的两个节点一定是叶子节点,且这两个叶子节点的路径有...

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

问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 书上的解法 书中对这个...

《编程之美》——求二叉树中节点的最大距离(非递归)

这里给出书中扩展问题提出的非递归解法。就像书中总结的时候给出的叶先生博客中关于本题的解法,这里同样不需要在节点中嵌入nMaxLeft、nMaxRight等额外数据。 主要原理是基于非递归后续遍历二叉...

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

问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 书上的解法 ...

《编程之美: 求二叉树中节点的最大距离》的另一个解法(觉得比书上的好)

《编程之美: 求二叉树中节点的最大距离》的另一个解法 问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树...

《编程之美: 求二叉树中节点的最大距离》的另一个解法

昨天花了一个晚上为《编程之美》,在豆瓣写了一篇书评《迟来的书评和感想──给喜爱编程的朋友》。书评就不转载到这里了,取而代之,在这里介绍书里其中一条问题的另一个解法。这个解法比较简短易读及降低了空间复杂...

编程之美: 求二叉树中节点的最大距离》的好解法

转自 :http://aclay.blog.163.com/blog/static/208468235201272392954636/ 昨天花了一个晚上为《编程之美》,在豆瓣写了一篇书评《迟...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)