題目要求比較簡單,寫一程式求一棵二叉樹中相距最遠的兩個節點之間的距離。
其實第一眼就能相當用遞迴是最簡單也是最直觀的:
以當前節點v為根的子樹中兩節點的最遠距離有三種情況:
1、距離最遠的兩個節點均在v的左子樹
2、距離最遠的兩個節點均在v的右子樹
3、距離最遠的兩個節點乙個在左子樹乙個在右子樹(或者v就是其中乙個節點)
對於第三種情況,只需要計算左子樹的高度和右子樹的高度,然後相加即可;
對於第一種和第二種情況,則需要知道左子樹的最遠距離,以及右子樹的最遠距離;
因此資料結構如下:
1struct node ;
其中left_height和right_height記錄左右子樹的高度;
函式實現如下:
1#define max(a, b) ((a) > (b) ? (a) : (b)) 2
3int find_max_len(node *t) 7
8int left_max_len = find_max_len(t->left); 9
int right_max_len = find_max_len(t->right); 10
11if (t->left) 14
if (t->right) 17
18int max_len = max(left_max_len, right_max_len);
19 max_len = max(max_len, t->left_height + t->right_height); 20
21return max_len;
22 }
函式有乙個返回值,用於返回以t為根的樹的最遠距離。
struct binarytreenode
;
struct result
;
result getmaxdistance(binarytreenode *& proot)
; return empty;
} result leftresult = getmaxdistance(proot->m_pleft);
result rightresult = getmaxdistance(proot->m_pright);
result result;
result.nmaxdepth = 1+ max(leftresult.nmaxdepth, rightresult.nmaxdepth);
result.nmaxdistance =max( max(leftresult.nmaxdistance, rightresult.nmaxdistance), (leftresult.nmaxdepth+rightresult.nmaxdepth+2) );
return result;
}
計算二叉樹的任意兩節點的最遠距離。
利用計算二叉樹高度的方法計算兩個節點最遠距離。計算出乙個節點的深度,左右子樹的深度,然後加起來,就是這個節點的最遠的距離了。然後遍歷二叉樹的所以的節點,找出最大的節點即可。include using namespace std typedef struct btreenode node void c...
二叉樹結點最遠距離
給定二叉樹,求取該二叉樹多有節點中距離最遠的結點相隔的距離 以root為根節點的樹上,最大距離求取 情況一 root的左子樹上的最大距離 情況二 root的右子樹上的最大距離 情況三 root左子樹上距離root結點最遠的距離,加上root自身這個節點,再加上root右子樹上距離root右孩子最遠的...
(演算法)二叉樹兩個結點的最遠距離
求二叉樹兩個結點的最遠距離。二叉樹定義如下 class treenode 遍歷每個節點,找出以當前節點為根的最長路徑,然後找出所有最長路徑中的最大值。1 class node void longestpath 1 node proot,int maxlen int rightlen if proot...