leetcode之124二叉樹中的最大路徑和

2022-06-07 07:48:13 字數 1989 閱讀 8071

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

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

示例 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 由於至少要講每乙個節點都訪問一次...