Leetcode 29 二叉樹中的最大路徑和

2022-09-19 06:00:10 字數 1177 閱讀 8832

題目:路徑被定義為一條從樹中任意節點出發,沿父節點-子節點連線,達到任意節點的序列。同乙個節點在一條路徑序列中 至多出現一次 。該路徑 至少包含乙個 節點,且不一定經過根節點。

路徑和 是路徑中各節點值的總和。

給你乙個二叉樹的根節點 root ,返回其 最大路徑和 。

示例 1:

輸入:root = [1,2,3]

輸出:6

解釋:最優路徑是 2 -> 1 -> 3 ,路徑和為 2 + 1 + 3 = 6

示例 2:

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

輸出:42

解釋:最優路徑是 15 -> 20 -> 7 ,路徑和為 15 + 20 + 7 = 42

思想:後序遍歷,我們把問題分成兩種情況

情況一:路徑包括當前結點(父節點)

我們需要將左右子樹的路徑資訊傳回,返回的值是子樹中最大的那一邊加上父節點的和,注意如果出現負值則捨棄不加入。

返回一邊的原因是,路徑不能走回頭路。

情況二:路徑不包括當前結點(父節點)

我們只需要返回左右子樹的最大路徑即可。

func maxpathsum(root *treenode) int 

left := dfs(root.left)

right := dfs(root.right)

curmax := root.val+left+right //情況二,我們先計算子樹的路徑大小,curmax

if curmax>max

var outmax int //情況一,如果考慮父結點,我們計算出能給父結點提供最大路徑的那一邊outmax,不同時使用兩邊是為了不重複路徑

if left>rightelse

if outmax>0

return 0 //如果左右子樹都提供負值,都捨棄返回父結點乙個0值

} dfs(root)

return max

}

leetcode 二叉樹 對稱二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...

LeetCode (二叉樹)反轉二叉樹

遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...

leetcode 二叉樹 二叉樹的層次遍歷

給定乙個二叉樹,返回其按層次遍歷的節點值。即逐層地,從左到右訪問所有節點 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回其層次遍歷結果 3 9,20 15,7 方法一 遞迴 思路 比較訪問節點所在層次level和當前最高層次len levels 判定是否需...