如果我們把二叉樹視為一個圖,父子節點之間的連線視為雙向的,我們姑且定義為“舉例”為兩節點之間邊的個數。寫一個程序求一顆二叉樹中相距最遠的兩個節點之間的距離(《編程之美》3.8)
思路:如果兩個節點相距最遠,一定是兩個葉子節點,或者是一個葉子節點到它的根節點。
根據相距最遠的兩個節點一定是葉子節點這個規律,我們可以進一步討論。
對於任意一個節點,以該節點為根,假設這個根有k個孩子節點,那么相距最遠的兩個節點U和V之間的路徑與這個根節點的關系有兩種情況。
1.若路徑經過根Root,則U和V是屬於不同子樹的,且它們都是該子樹種到根節點最遠的節點,否則跟它們的最遠距離矛盾。
2. 如果路徑不經過Root,那么它們一定屬於根的k個子樹之一。並且它們也是該子樹相距最遠的兩個頂點。
參考資料:
1. http://www.cnblogs.com/miloyip/archive/2010/02/25/1673114.html
int GetMaxDistance(TreeNode* root) { if (root == NULL) return 0; int max_distance = INT_MIN; GetMaxDistance(root, INT_MIN); return max_distance } int GetMaxDistance(TreeNode* root, int &max_distance) { if (root == NULL) return -1; int left_max_depth = GetMaxDistance(root->left, &max_distance); int right_max_depth = GetMaxDistance(root->right, &max_distance); int temp_distance = left_max_depth + right_max_depth + 2; if (temp_distance > max_distance) max_distance = temp_distance; return left_max_depth > right_max_depth ? left_max_depth + 1 : right_max_depth + 1; }