成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

二叉樹中和為某一值的路徑

開發 前端
按照前序遍歷的順序去訪問這顆二叉樹,在訪問節點10之后,就會訪問節點5。圖中二叉樹并沒有指向父節點的指針,當訪問節點5的時候,我們是不知道前面經過了哪些節點的,此時我們就需要準備一個棧,用來存儲訪問過的節點。

思路分析

我們舉例來做分析,如下圖所示,我們準備了一顆二叉樹和一個整數22,通過觀察后,我們很容易就能看出它有兩條路徑的節點值加起來和為22。

  • 10、5、7
  • 10、12

圖片

上述兩個路徑都是從根節點出發到葉子節點的,也就是說路徑總是以根節點為起始點,因此我們首先需要遍歷根節點。在樹的三種遍歷方式中,只有前序遍歷是首先訪問根節點的。

按照前序遍歷的順序去訪問這顆二叉樹,在訪問節點10之后,就會訪問節點5。圖中二叉樹并沒有指向父節點的指針,當訪問節點5的時候,我們是不知道前面經過了哪些節點的,此時我們就需要準備一個棧,用來存儲訪問過的節點。

當到達節點5的時候,路徑中包含兩個節點:10、5。接下來遍歷到節點4,我們把這個節點入棧,這時候已經到達葉節點,但棧中的所有節點之和是19。這個和不等于輸入的值22,因此它不符合要求的路徑。

最后,我們要遍歷的節點是12。在遍歷這個節點之前,需要先經過節點5回到節點10。同樣的,每次當從子節點回到父節點的時候,我們都需要在路徑上刪除子節點。最后在節點10到達節點12的時候,路徑上的兩個節點的值之和也是22,因此這也是一條符合要求的路徑。

  • 分析到這里,我們就找到了一些規律:
  • 當用前序遍歷的方式訪問到某一節點時,就把該節點添加到路徑上,并累加該節點的值
  • 如果該節點為葉節點,并且路徑中節點值的和剛好等于輸入的整數,則當前路徑符合要求
  • 如果該節點非葉節點,則繼續訪問它的子節點。從節點路徑棧中刪除當前節點

遞歸上述過程,直至二叉樹的所有節點訪問完畢。

圖片

實現代碼

形成了清晰的思路之后,接下來我們就可以輕松的寫出代碼了,如下所示:

  • 聲明需要的變量:已訪問過的路徑棧、滿足預期的路徑數組、當前已訪問節點的值總和
  • 從root節點開始,用前序遍歷訪問所有節點,篩選并存儲滿足預期條件的路徑
  findPath(root: Node<number>, expectedSum: number): Array<string> {
if (root == null) return [];

// 用一個棧來存儲訪問過的路徑
const pathStack = new Stack();
// 存儲符合條件的路徑
const pathList: Array<string> = [];
// 當前已訪問路徑總和
const currentSum = 0;
// 從root節點開始搜索節點
this.searchNode(root, expectedSum, pathStack, currentSum, pathList);
return pathList;
}
  • 取出根節點的值,將其進行累加
  • 累加后,將根節點的值壓入路徑棧中
  • 判斷是否訪問到了葉節點,如果為葉節點且當前已訪問的節點路徑總和等于預期條件則將路徑棧中的路徑放入符合條件的路徑數組中
  • 當前節點非葉節點,則繼續遞歸訪問它的左、右子樹
  • 左、右子樹都訪問完成后,則代表當前路徑不滿足預期條件,將其從路徑棧中出棧
private searchNode(
root: Node<number>,
expectedSum: number,
pathStack: Stack,
currentSum: number,
pathList: Array<string>
) {
// 累加當前已訪問節點的和,將當前節點入棧
currentSum += root.key;
pathStack.push(root.key);

// 如果是葉節點,并且路徑上節點值的和等于輸入的值,則存儲當前路徑棧中的節點
const isLeaf = root.left == null && root.right == null;
if (currentSum == expectedSum && isLeaf) {
pathList.push(pathStack.toString());
}
// 非葉子節點,則遍歷它的子節點
if (root.left != null) {
this.searchNode(root.left, expectedSum, pathStack, currentSum, pathList);
}
if (root.right != null) {
this.searchNode(root.right, expectedSum, pathStack, currentSum, pathList);
}

// 當前節點不符合條件,將其出棧
pathStack.pop();
}

測試用例

接下來我們用文章開頭的例子來測試下上述代碼能否正確執行。

const tree: Node<number> = {
key: 10,
left: {
key: 5,
left: {
key: 4
},
right: {
key: 7
}
},
right: {
key: 12
}
};
const targetVal = 22;
const resultPath = treeOperateTest.findPath(tree, targetVal);
console.log(resultPath);

如下所示,成功得計算出了兩條路徑。

圖片

我們將節點12改成20,再來測試下,結果如下所示,只有一條路徑符合預期。

圖片

示例代碼

本文用到的代碼完整版請移步:

  • TreeOperate.ts
  • TreeOperate-test.ts
責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2021-12-05 18:25:12

二叉樹路徑節點

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-05-06 17:46:30

二叉樹數據結構

2021-04-20 08:37:14

數據結構二叉樹

2021-04-19 07:47:42

數據結構二叉樹Tree

2021-04-28 20:12:27

數據結構創建

2021-08-27 11:36:44

二叉樹回溯節點

2021-09-29 10:19:00

算法平衡二叉樹

2022-10-26 23:58:02

二叉樹數組算法

2021-12-17 14:26:58

二叉樹節點數量

2021-11-29 10:40:58

二叉樹鏡像節點

2013-07-15 16:35:55

二叉樹迭代器

2021-03-17 08:19:22

二叉樹LeetCode

2021-08-06 11:34:05

二叉樹遞歸回溯

2020-09-23 18:25:40

算法二叉樹多叉樹

2021-09-15 07:56:32

二叉樹層次遍歷

2021-10-12 09:25:11

二叉樹樹形結構

2022-07-27 07:45:53

二叉樹鏡像函數

2022-10-12 23:25:17

二叉樹父節點根節點

2018-03-15 08:31:57

二叉樹存儲結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品网站 | 亚洲国产伊人 | 欧美韩一区二区三区 | 日韩二区| a免费观看| 国产在线一区二区 | av中文字幕网站 | 欧美三区视频 | 国产黄色在线观看 | 久草视频网站 | 成人一区在线观看 | 中文字幕免费视频 | 国产精品视频999 | 国产一区二区 | 亚洲免费在线观看av | 偷拍自拍网址 | 色久五月| 色综合久久久久 | 国户精品久久久久久久久久久不卡 | 色婷婷综合久久久中文字幕 | 亚洲免费视频网站 | 精品视频免费 | 久久久久久国产精品 | 色久在线| 国产精品视频一二三区 | 午夜精品久久久久久久久久久久久 | 高清一区二区三区 | 999精品网| 久久精品视频播放 | 日本久草| 精品影视| 国产在线对白 | 久久99精品久久久久 | 日韩中文字幕av | 二区在线观看 | 日韩欧美在线视频一区 | 国产日韩欧美综合 | 久热久热| 欧美日韩第一页 | 久久久av中文字幕 | 亚洲午夜电影 |