L112 路徑總和

2021-10-06 01:32:50 字數 2360 閱讀 3178

路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。

說明: 葉子節點是指沒有子節點的節點。

示例:給定如下二叉樹,以及目標和 sum = 22,

5

/ \4 8

/ / \

11 13 4

/ \ \

7 2 1

返回 true, 因為存在目標和為 22 的根節點到葉子節點的路徑 5->4->11->2。

1.遞推法

(官方思路)

class

solution

boolean

find

(treenode root,

int now,

int sum)

now = now + root.val;

//這裡要提前加好

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

return

find

(root.left,now, sum)

||find

(root.right, now , sum);}

}

2.自己嘗試的方法,只能通過一半

class

solution

void

find

(treenode root,

int now,

int sum)}if

(root.left != null)

find

(root.left, now + root.val, sum);if

(root.right != null)

find

(root.right, now + root.val, sum);}

}

實際上述 的寫法根本都到不了遞推邊界,

改寫

class

solution

void

find

(treenode root,

int now,

int sum)

}else

}}

但是這樣寫有新的問題,對於輸入:

[1,2]1輸出

true

預期結果

false

在於根節點並不是葉子節點,但是體重並沒有這樣的判斷

與官方版本架構是一樣的,就是不帶返回值

兩種寫法

class

solution

void

find

(treenode root,

int now,

int sum)}if

(root.left != null)

find

(root.left, now, sum)

;//兩個語句本身也是||的關係

if(root.right != null)

find

(root.right, now, sum);}

}

class

solution

void

find

(treenode root,

int now,

int sum)

}find

(root.left, now, sum)

;//兩個語句本身也是||的關係

find

(root.right, now, sum);}

}

2.可以直接用乙個函式

class

solution

return

haspathsum

(root.left, sum)

||haspathsum

(root.right, sum);}

}

3、利用非遞推方法

dfs

class

solution

if(root.left != null)

if(root.right != null)

}return

false;}

}

2.bfs

class

solution

if(root.left != null)

if(root.right != null)

}return

false;}

}

112 路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和sum 22,5 48 1113 4 721返回true,因為存在目標和為 22 的根節點到葉子節點的路徑5 4 11 2。d...

112路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。進行分析,遞迴終止的條件是什麼?一次遞迴中要進行什麼操作?遞迴想要返回什麼資訊?終止條件 結點為空 遞迴中操作 sum減去當前結點值,當sum為0且當前為葉子...

112 路徑總和

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 1返回 true,因為存在目標和為 22 的根節點到葉子節點的路徑 5 4...