路徑總和
給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。
說明: 葉子節點是指沒有子節點的節點。
示例:給定如下二叉樹,以及目標和 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...