数据结构 - 求二叉树中结点的最大距离(C++)

// ------BTreeMaxNodeLength.cpp------

#include <iostream>

using namespace std;

template <class T>
struct BTNode
{
	// 左孩子
	BTNode<T> *lChild;
	// 右孩子
	BTNode<T> *rChild;
	// 该结点的值
	T data;
	// 左子树最长距离
	int leftSubTreeMaxLength;
	// 右子树最长距离
	int rightSubTreeMaxLength;
};

template <class T>
class BinaryTree
{
public:
	void GetMaxNodeLength(BTNode<T> * root, int *maxNodeLength)
	{
		// 遍历到叶子结点,返回
		if (root == NULL)
		{
			return;
		}

		// 假设左子树为空,那么该结点左子树最长距离为0
		if (root->lChild == NULL)
		{
			root->leftSubTreeMaxLength = 0;
		}

		// 假设右子树为空,那么该结点右子树最长距离为0
		if (root->rChild == NULL)
		{
			root->rightSubTreeMaxLength = 0;
		}

		// 假设左子树不为空,递归查找左子树最长距离
		if (root->lChild != NULL)
		{
			GetMaxNodeLength(root->lChild, maxNodeLength);
		}

		// 假设右子树不为空,递归查找右子树最长距离
		if (root->rChild != NULL)
		{
			GetMaxNodeLength(root->rChild, maxNodeLength);
		}

		// 计算左子树中距离根结点的最长距离
		if (root->lChild != NULL)
		{
			if (root->lChild->leftSubTreeMaxLength > root->lChild->rightSubTreeMaxLength)
			{
				root->leftSubTreeMaxLength = root->lChild->leftSubTreeMaxLength + 1;
			}
			else
			{
				root->leftSubTreeMaxLength = root->lChild->rightSubTreeMaxLength + 1;
			}
		}

		// 计算右子树中距离根结点的最长距离
		if (root->rChild != NULL)
		{
			if (root->rChild->leftSubTreeMaxLength > root->rChild->rightSubTreeMaxLength)
			{
				root->rightSubTreeMaxLength = root->rChild->leftSubTreeMaxLength + 1;
			}
			else
			{
				root->rightSubTreeMaxLength = root->rChild->rightSubTreeMaxLength + 1;
			}
		}

		// 更新最长距离
		if (root->leftSubTreeMaxLength + root->rightSubTreeMaxLength > *maxNodeLength)
		{
			*maxNodeLength = root->leftSubTreeMaxLength + root->rightSubTreeMaxLength;
		}
	}
};
时间: 2024-10-09 22:29:40

数据结构 - 求二叉树中结点的最大距离(C++)的相关文章

编程之美——3.8求二叉树中结点的最大距离(树,递归,动态规划)

<编程之美>读书笔记12: 3.8 求二叉树中节点的最大距离 问题: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 实际上就是求树的直径.若采用“动态规划方法”思想,会将该问题分解成“具有最大距离两点间的路径是否经过根节点”两个子问题,然后再对这两个子问题求解判断.实际上,不必这么麻烦.距离最远的两点必然在以某个节点A为根的子树上,它们间的路径必然经过该子树的根节

数据结构 - 求二叉树中节点的最大距离

typedef struct Node { struct Node *pleft; //左孩子 struct Node *pright; //右孩子 char chValue; //该节点的值 int leftMaxValue; //左子树最长距离 int rightMaxValue; //右子树最长距离 }LNode, *BinTree; void findMaxLen(BinTree root, int *maxLen) { //遍历到叶子结点,返回 if(root == NULL) ret

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

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

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

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

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

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

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

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

二叉树进阶之求一棵二叉树中结点间最大距离

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6618074.html 二叉树中的结点间距离:从结点A出发到达B,每个结点只能走一次,AB路径上的结点数就是AB间距离. 由于从一个结点出发时,只有两种方向可走:向上经过父节点到达它的兄弟子树:向下到达它自己的左右子树: 对于一个结点h为根的子树:假设现在从h左子树中最深的叶结点逐层向上走,一直走到h的左儿子,现在h.left有两种选择: 一是向上经过h,然后到达h的右子树向下走到最深叶结点: 二是从h.le

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

描述:如果把二叉树看成一个图,父子节点之间的连线看成双向的,定义“距离”为两个节点之间边的个数.求二叉树中相距最远的两个节点的距离. 思路:相距最远的两个节点一定是叶子节点,且这两个叶子节点的路径有两种情况: 1. 该路径经过root节点,则两个叶子节点分属root.left和root.right为根的子树,而且是两个子树中距离root.left和root.right最远的叶子节点: 2. 该路径不经过root节点,则这两个叶子节点的root.left或root.right上: 根据以上分析,参

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