二叉樹的直徑
根據題目意思,所謂二叉樹的直徑,就是以某一結點為根,左右子樹深度之和減1。二叉樹的題目,不用多說,肯定是遞迴遍歷框架。
//後序
void
lastorder
(treenode* root)
考慮的重點在於,後序中的操作是什麼,左右子樹返回什麼。顯然,對於當前訪問的結點,我們的目標是以它為根的直徑,即左右子樹的深度和減1,ok,左右子樹返回值出來了,就是各自的最大深度的結點數量,後序操作也出來了,求去當前的直徑,儲存最大值。注意為什麼要後續?因為需要先得到左右子樹的結果,才能計算當前直徑呀。
int
lastorder
(treenode* root)
注意上述細節
1、ans=max(ans,l+r+1)
為什麼有+1?因為l和r是不包括當前結點的子樹的最深路徑經過的結點數,因此,結果更新要加上當前root。
2、return max(l,r)+1
為什麼有+1?同理,返回當前子樹最大深度經過的結點數
那麼主函式呢?
int
diameterofbinarytree
(treenode* root)
通過遞迴,更新ans。為什麼最後的結果是ans-1?注意我們的遞迴函式,每一次返回的是左右子樹最大結點數+1,當到遞迴返回到初始root的那一幀時,結果更新有兩種。
1、是左右子樹結果的拼接再+1(當前結點),是結點數,根據前述,直徑為其減去1;
2、是之前的某乙個結果,即左右拼接小於之前的ans,即相當於結果為上一層遞迴時的更新結果,假設是左子樹的結果,則最後的結果要減去左子樹的根結點。
為什麼要初始化ans=1?防止空樹返回-1。
最長同值路徑
這道題的思路大致上和題1是一樣的,但是增加了乙個限制條件,路徑中的結點值要相同。
老規矩先上後序框架(多看多記)
void
lastorder
(treenode* root)
第二步,考慮後序操作是什麼,返回值是什麼。
根據題意,遞迴求每乙個子樹的同值路徑,求最大值,顯然需要乙個全域性變數(非嚴格意義,為易於理解這樣說,實際是class的成員)進行更新。
子樹呼叫返回自己的同值路徑,後序操作更新最大值,返回。
後序怎麼操作?如果當前結點的值與其孩子相同,則要加上孩子返回的結果。若否,中斷,結果為0。
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
intlongestunivaluepath
(treenode* root)
};
二叉樹的直徑
題目 給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。示例 給定二叉樹 返回 3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 注意 兩結點之間的路徑長度是以它們之間邊的數目表示。思想 我們不難發現這個問題的本質就是求每個...
二叉樹的直徑
題目 給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。definition for a binary tree node.public class treenode class solution diameterofb...
二叉樹的直徑
給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。示例 給定二叉樹 返回 3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 概念理解 這條路徑可能穿過也可能不穿過根結點 任意一條路徑可由某結點為起點,再向下遍歷其...