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

如果把二叉树看成一个图,父子节点之间的连线看成是双向的,定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。

1 分析

二叉树中节点的最大距离必定是两个叶子节点的距离。求某个子树的节点的最大距离,有三种情况:1.两个叶子节点都出现在左子树;2.两个叶子节点都出现在右子树;3.一个叶子节点在左子树,一个叶子节点在右子树。只要求得三种情况的最大值,结果就是这个子树的节点的最大距离。

int find_max_len(Node *root);

case 1: 两个叶子节点都出现在左子树。find_max_len(root->pLeft);

case 2: 两个叶子节点都出现在右子树。find_max_len(root->pRight);

case 3: 一个出现在左子树,一个出现在右子树。distance(root->pLeft) + distance(root->pRight) + 2;其中,distance()计算子树中最远的叶子节点与根节点的距离,其实就是左子树的高度减1。

2 实现

struct Node {
	int data;
	Node *pLeft;
	Node *pRight;
};

// 计算树的高度
int height(Node *root)
{
	if(root == NULL) {
		return 0;
	}

	return max(height(root->pLeft), height(root->pRight)) + 1;
}

int find_max_len(Node *root)
{
	if(root == NULL) {
		return 0;
	}

	int lmax = find_max_len(root->pLeft); // 左子树中的最大距离
	int rmax = find_max_len(root->pRight); // 右子树中的最大距离

	int lh = 0, rh = 0;

	if(root->pLeft) {
		// 左子树最远的叶子节点与根节点的距离
		lh = height(root->pLeft);
	}

	if(root->pRight) {
		// 右子树最远的叶子节点与根节点的距离
		rh = height(root->pRight);
	}

	return max(max(lmax, rmax), lh + rh);
}

猜你喜欢

转载自blog.csdn.net/u010325193/article/details/87854331