演算法 二叉樹路徑問題

2021-10-04 18:19:21 字數 3688 閱讀 2484

二叉樹的路徑問題一般可以用dfs搜尋來解決,遞迴的思想一定要理解(注重最後一步和終止條件)

//

public

boolean

haspathsum

(treenode root,

int sum)

sum-=root.val;

if(sum==

0&&root.left==null&&root.right==null)

//找一下左右子樹

return

haspathsum

(root.left,sum)

||haspathsum

(root.right,sum)

;}

public list

>

pathsum

(treenode root,

int sum)

public

void

dfs(list

> list,list

path,treenode root,

int sum)

sum-=root.val;

path.

add(root.val)

;//終止條件

if(sum==

0&&root.left==null&&root.right==null)

else

path.

remove

(path.

size()

-1);

}

public list

binarytreepaths

(treenode root)

public

void

dfs(list

list,string path,treenode node)

string temp="";

if(path.

length()

==0)else

if(node.left==null&&node.right==null)

else

}

124. 二叉樹中的最大路徑和 hard難度。

給定乙個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。

示例 1:

輸入: [1,2,3]

1/ \

2 3

輸出: 6

示例 2:

輸入: [-10,9,20,null,null,15,7]

-10/ \

9 20

/ \

15 7

輸出: 42

本例中需要注意的就是有可能不經過根節點,但我們知道,這條路徑必然會經過乙個節點

所以我們在經過每個節點的時候計算最大路徑值,更新現有的最大路徑值

max=math.

max(max,leftsum+rightsum+node.val)

;//經過當前節點的最大路徑和

然後返回經過本節點的乙個較大分支

return node.val+math.

max(leftsum,rightsum)

;//經過該節點的一支較大的路徑

左子樹最大路徑和為

int leftsum=math.

max(0,

helper

(node.left)

);

public

intmaxpathsum

(treenode root)

private

int max=integer.min_value;

private

inthelper

(treenode node)

int leftsum=math.

max(0,

helper

(node.left));

int rightsum=math.

max(0,

helper

(node.right));

max=math.

max(max,leftsum+rightsum+node.val)

;//經過當前節點的最大路徑和

return node.val+math.

max(leftsum,rightsum)

;//經過該節點的一支較大的路徑

}

543. 二叉樹的直徑

給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。

示例 :

給定二叉樹

1/ \

2 3

/ \

4 5

返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。

注意:兩結點之間的路徑長度是以它們之間邊的數目表示。

這個題其實也很容易理解,就是某個節點的左子樹深度+右子樹深度,就是他的直徑。

明白了這一點,我們再想一想我們是如何求二叉樹深度的?

public

intgetdepth

(treenode node)

return

1+math.

max(

getdepth

(node.left)

,getdepth

(node.right));

}

現在我們對其改造一下,改造的點就是我們對每個點的左右子樹進行判斷,而不僅僅是根節點的左右子樹。左右子樹的高度和就是直徑

int max=0;

public

intgetdepth

(treenode root)

public

intdepth

(treenode node)

int leftdepth=

depth

(node.left)

;int rightdepth=

depth

(node.right)

;int temp=leftdepth+rightdepth;

max=math.

max(max,temp)

;return math.

max(leftdepth,rightdepth)+1

;}}

和最大深度很相似,不過要分左子樹和右子樹中有乙個為null的情況。

public

intmindepth

(treenode root)if(

(root.left==null&&root.right!=null)

||(root.left!=null&&root.right==null)

)return

1+math.

min(

mindepth

(root.left)

,mindepth

(root.right));

}

二叉樹路徑和問題

今天回顧了一下二叉樹給定sum的問題,邏輯還是有問題,本以為對的,寫了如下的 bool haspathsum treenode root,int sum if path sum return true p s.top s.pop if p left null path p left val p p ...

二叉樹路徑搜尋問題

1 求任意二叉樹中的所有路徑 細想一下,這其實是乙個dfs問題。有乙個helper函式,用來向list中新增string。這裡為什麼要用靜態的string而不是動態的stringbuilder?另乙個問題是,要動態地新增內容給list,從思路上講應該是回溯法。回溯用動態子結構比如list的話,就需要...

二叉樹路徑和問題

問題一 二叉樹中最大路徑和 leetcode124 問題描述 給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。大體思路 其最大路徑和有以下四種可能 1 由當前結點的左子樹結點到右子樹結點 2 由當前結點...