兩個葉子節點之間的路徑 = 根節點左右兒子的深度之和 ;
節點的深度是節點左右子樹的節點深度+1---max(L,R),LR是左右節點深度;
一顆二叉樹的直徑長度是任意兩個節點路徑長度的最大值,可能這條路徑不會穿過根節點。路徑的長度爲經過該路徑的節點數減去1,所以求直徑等效於求路徑經過節點數的最大值減去1.
因爲直徑長度可能不會經過根節點,所以在程序開始的時候定義一個全局變量用來保存每一次計算路徑的最大值,該路徑-1就是最長直徑長度。
int ans; //全局變量保存每次路徑的最大值
int max(int a,int b){
return (a>=b ? a:b);
}
int deepth(struct TreeNode *rt){ //遞歸求路徑長度 = L+R+1
if(rt == NULL)
return 0;
int L = deepth(rt->left);
int R = deepth(rt->right);
ans = max(ans,L+R+1); //保存最大路徑
return max(L,R)+1;
}
int diameterOfBinaryTree(struct TreeNode* root){
ans = 1;
deepth(root);
return ans-1;
}