給定乙個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義為一條從樹中任意節點出發,沿父節點-子節點連線,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。
示例 1:
輸入:[1,2,3]
1/ \
2 3
輸出:6
示例 2:
輸入:[-10,9,20,null,null,15,7]
-10/ \
9 20
/ \
15 7
輸出:42
在本題中採用了遞迴的方法,思路就是遍歷每乙個結點,然後取得最大值,設結點node
,它的左子樹的最大值為lnode
,它的右子樹的最大值為rnode
,那麼對於結點node
的最大路徑和為:
max(node.val,node.val+lnode,node.val+rnode,node.val+lnode+rnode,lnode,rnode)
,就是獲取他們中的最大值
但是我們在求結點node
的子樹的最大值的時候,需要注意一下幾個方面
演算法步驟如下:
如果node
的右子樹存在,呼叫遞迴函式,傳入node.right
,得到結果rnode
當左右子樹同時存在的時候,還要比較res
遞迴函式的返回值為max(node.val,node.val+lnode,node.val+rnode)
golang
func maxpathsum(root *treenode) int
res := root.val
var findmax func(node *treenode) int
findmax = func(node *treenode) int
if node.left != nil
if res < lroot
if tmpmax < node.val+lroot
} if node.right != nil
if res < rroot
if tmpmax < node.val+rroot
} if lexist && rexist
} return tmpmax
} _ = findmax(root)
return res
}
c++
struct treenode
treenode(int x):val(x),left(nullptr),right(nullptr){}
treenode(int x,treenode *left,treenode *right):val(x),left(left),right(right){}
};class solution
int res=root->val;
findmax(root,res);
return res;
}int findmax(treenode *root,int &res)
int tmpmax=root->val;
res=res>tmpmax?res:tmpmax;
bool lexist=false,rexist=false;
int lroot=0,rroot=0;
if (root->left)
if (root->right)
if (lexist&&rexist)
return tmpmax;
}};int main()
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說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。遞迴 definit...
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 由於至少要講每乙個節點都訪問一次...