1. 程式人生 > >二叉樹的任意兩節點間的最大距離

二叉樹的任意兩節點間的最大距離

1.問題定義

如果我們把二叉樹看成一個圖,父子結點之間的連線看成是雙向的,我們姑且定義“距離”為兩節點之間邊的個數。

寫一個程式求一棵二叉樹中相距最遠的兩個結點之間的距離


2.解法

計算一個二叉樹的最大距離無外乎兩種情況:

A. 路徑經過左子樹的最深結點,再通過根節點,最後到右子樹的最深結點。

B. 路徑不穿過根節點,而是左子樹或右子樹的最大距離路徑,取其最大者。


struct Node{
	Node* left;//左子樹
	Node* right;//右子樹
	int	  maxleft;//左子樹中的最長距離
	int   maxright;//右子樹的最長距離
	char  val;//該結點的值
};
int nMaxLen = 0;
void FindMaxLen(Node* root){//尋找樹中最長的兩段距離
	if (root == NULL)
		return;//遍歷到葉子節點,返回
	//如果左子樹為空,那麼該節點的左邊最長距離為0
	if (root->left == NULL){
		root->maxleft = 0;
	}
	if (root->right == NULL){
		root->maxright = 0;
	}
	if (root->left != NULL){//如果左子樹不為空,遞迴尋找左子樹最長距離
		FindMaxLen(root->left);
	}
	if (root->right != NULL){//如果右子樹不為空,遞迴尋找右子樹最長距離
		FindMaxLen(root->right);
	}
	//計算左子樹最長節點距離
	if (root->left != NULL){
		int nTmpMax = 0;
		if (root->left->maxleft > root->left->maxright)
			nTmpMax = root->left->maxleft;
		else
			nTmpMax = root->left->maxright;
		root->maxleft = nTmpMax + 1;
	}
	if (root->right != NULL){
		int nTmpMax = 0;
		if (root->right->maxleft > root->right->maxright)
			nTmpMax = root->right->maxleft;
		else
			nTmpMax = root->right->maxright;
		root->maxright = nTmpMax + 1;
	}
	//更新最長距離
	if (root->maxleft + root->maxright > nMaxLen)
	{
		nMaxLen = root->maxleft + root->maxright;
	}
}