二叉樹的任意兩節點間的最大距離
阿新 • • 發佈:2019-01-29
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; } }