二叉樹直徑問題

2021-10-08 10:30:04 字數 1638 閱讀 4440

二叉樹的直徑

根據題目意思,所謂二叉樹的直徑,就是以某一結點為根,左右子樹深度之和減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 概念理解 這條路徑可能穿過也可能不穿過根結點 任意一條路徑可由某結點為起點,再向下遍歷其...