leetcode 二叉樹與遞迴

2021-09-16 18:28:43 字數 4417 閱讀 5917

給定乙個二叉樹,找出其最大深度。

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

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

示例:給定二叉樹 [3,9,20,null,null,15,7],

3/ \

9  20

/  \

15   7

返回它的最大深度 3 。

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

return math.max(maxdepth(root.left)+1, maxdepth(root.right)+1);}}

翻轉一棵二叉樹。

示例:輸入:

4/   \

2     7

/ \   / \

1   3 6   9

輸出:4

/   \

7     2

/ \   / \

9   6 3   1

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

treenode l = inverttree(root.left);

treenode r = inverttree(root.right);

root.left = r;

root.right = l;

return root;}}

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

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

示例: 

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

5/ \

4   8

/   / \

11  13  4

/  \      \

7    2      1

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

思路:sum = 5 時, 在如下情況,注意遞迴終止條件,需要滿足從根節點到葉子節點,非葉子節點求得的值不滿足題意

5\8

/ \13 4

/ \ \

7 2 1

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

//葉子節點

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

if(haspathsum(root.left, sum-root.val))

if(haspathsum(root.right, sum-root.val))

return false;}}

給定乙個二叉樹,返回所有從根節點到葉子節點的路徑。

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

示例:輸入:

1/   \

2     3\5

輸出: ["1->2->5", "1->3"]

解釋: 所有根節點到葉子節點的路徑為: 1->2->5, 1->3

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

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

listll = binarytreepaths(root.left);

for(string e : ll)

listrl = binarytreepaths(root.right);

for(string e : rl)

return l; }}

給定乙個二叉樹,它的每個結點都存放著乙個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。

示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

10/  \

5   -3

/ \    \

3   2   11

/ \   \

3  -2   1

返回 3。和等於 8 的路徑有:

1.  5 -> 3

2.  5 -> 2 -> 1

3.  -3 -> 11

思路:注意該題,尋找的路徑不一定是從當前節點出發,用乙個額外的遞迴實現從當前節點出發滿足條件的路徑的條數,使用雙重遞迴,遞迴巢狀

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

int res = paths(root, sum);

res += pathsum(root.left, sum);

res += pathsum(root.right, sum);

return res;

}//以當前節點為出發點,滿足條件的路徑數目

private int paths(treenode root, int sum)

if(root.val == sum)

res += paths(root.left, sum-root.val);

res += paths(root.right, sum-root.val);

return res;}}

二分搜尋樹的基本操作:插入(insert),查詢(find),刪除(delete)由於二分搜尋樹天生的順序性,可以很方便的實現一些操作:

給定乙個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。

例如,給定如下二叉搜尋樹:  root = [6,2,8,0,4,7,9,null,null,3,5]

示例 1:

輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8

輸出: 6 

解釋: 節點 2 和節點 8 的最近公共祖先是 6。

示例 2:

輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4

輸出: 2

解釋: 節點 2 和節點 4 的最近公共祖先是 2, 因為根據定義最近公共祖先節點可以為節點本身。

說明:所有節點的值都是唯一的。

p、q 為不同節點且均存在於給定的二叉搜尋樹中。

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

if(root.val>q.val && root.val>p.val)

if(root.val=p.val && root.val<=q.val) || (root.val>=q.val && root.val<=p.val) )

return root;}}

236 (經典的lca問題 lowest common ancestor of a binary tree)

二叉樹與遞迴

給中序遍歷和後續遍歷,求從根到葉子權值最小的路徑,的葉子節點的值。若有多條,求葉子最小的。include include include include using namespace std const intmaxn 10005 struct node intin maxn post maxn ...

二叉樹與遞迴

上圖是一顆二叉樹,二叉樹的特點是 二叉樹的每個節點的左右子樹也是一顆二叉樹 需要特殊說明的是,空 也是一顆二叉樹。二叉樹可以拆分為多個小二叉樹,小二叉樹的性質和大二叉樹的性質完全一樣。這種性質和遞迴演算法很相似,遞迴演算法也是把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解。我們...

LeetCode 二叉樹剪枝(遞迴)

給定二叉樹根結點 root 此外樹的每個結點的值要麼是 0,要麼是 1。返回移除了所有不包含 1 的子樹的原二叉樹。節點 x 的子樹為 x 本身,以及所有 x 的後代。示例1 輸入 1,null,0,0,1 輸出 1,null,0,null,1 解釋 只有紅色節點滿足條件 所有不包含 1 的子樹 右...