前端程式設計師學好演算法系列(八)二叉樹和遞迴

2022-08-04 10:57:09 字數 3041 閱讀 1644

257. 二叉樹的所有路徑

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

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

示例:

輸入:1/\

23\5

輸出: [

"1->2->5

", "

1->3

"]

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

解題:1. root == null 直接return

2. 判斷我們的路徑是否到達到乙個葉子節點中  if(root.left==null && root.right == null) 說明我們到達了乙個節點 直接res.push(root.val) 然後返回當前值

3. 我們遞迴 呼叫binarytreepaths(root.left) 返回左子樹上滿足條件的所有路徑 ,遍歷獲得的路徑 res.push(root.val+'->' lefts[i])  這樣我們就獲得了我們左子樹上的所有路徑;

4.同樣方法獲取右邊的所有路徑

/*

* * definition for a binary tree node.

* function treenode(val) */

/*** @param root

* @return */

var binarytreepaths =function(root)

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

) let lefts =binarytreepaths(root.left)

for(let i=0;i)

let rights =binarytreepaths(root.right)

for(let i=0;i)

return

res};

437. 路徑總和 iii

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

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

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

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

示例:

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

10/\

5 -3

/\ \32

11/\ \

3 -2

1返回

3。和等於 8

的路徑有:

1. 5 -> 3

2. 5 -> 2 -> 1

3. -3 -> 11

解題:

1.我們的主函式每次求解需要求解node node.left和node.right   求解node又需要求解其子函式findpath(sum) 和findpath(sum.left)和findpath(sum.right)

2.在findpath中由於node.val 存在負值所以我們不能直接求res = 1 需要 res+=1

3.我們用 findpath(root,sum); 求出從根節點出發所有可能的路徑

4. 我們在分別從 pathsum(root.left,sum)  pathsum(root.right,sum)  從左右節點出發滿足條件的路徑

/*

* * definition for a binary tree node.

* function treenode(val, left, right) */

/*** @param root

* @param sum

* @return */

var pathsum =function(root, sum)

let res = 0

if(node.val ==num)

res += findpath(node.left,num -node.val);

res += findpath(node.right,num -node.val);

return

res }

};

235. 二叉搜尋樹的最近公共祖先

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

例如,給定如下二叉搜尋樹: 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。

解題:1.二叉搜尋樹滿足,其任意左節點小於右節點,

2.當p和q分別在根節點的左邊和右邊時 根節點及為最近公共祖先

3.當 root.val>p.val && root.val>q.val  在root的左子樹中尋找

4.當root.val

/*

* * definition for a binary tree node.

* function treenode(val) */

/*** @param root

* @param p

* @param q

* @return */

var lowestcommonancestor =function(root, p, q)

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

if(root.valq.val)

return

root

};

二叉樹的js內容我們就先介紹到這裡

前端程式設計師學好演算法系列(十)動態規劃

動態規劃整體思路是用遞迴問題求解,然後對遞迴過程中存在的大量重疊子問題進行優化,自頂向下的求解的思路為記憶化搜尋,自底向上的解決問題的思想就是動態規劃,自頂向下的求解通常更好理解,我們理解後在改成自底向上的動態規劃求解 劍指 offer 10 i.斐波那契數列 寫乙個函式,輸入 n 求斐波那契 fi...

演算法系列之二叉樹

資料結構中有一種結構是樹,不過一般我們常見的是樹中的一種特殊型別 二叉樹。二叉樹簡單來說就是每個節點最多有兩個子節點。如果每個節點都有兩個子節點,那麼我們稱這種二叉樹為滿二叉樹。還有一種二叉樹,其葉子節點都在最底下兩層,最後一層葉子節點都靠左排列,並且除了最後一層,其他層的葉子節點都要達到最大,這種...

小蠢魚演算法系列之二叉樹排序

package com.foolfish.tree desc 二叉樹演算法 author foolfish.chen public class binarytree return the nodevalue public int getnodevalue param nodevalue the no...