偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開發(fā) 前端
按照前序遍歷的順序去訪問(wèn)這顆二叉樹,在訪問(wèn)節(jié)點(diǎn)10之后,就會(huì)訪問(wèn)節(jié)點(diǎn)5。圖中二叉樹并沒有指向父節(jié)點(diǎn)的指針,當(dāng)訪問(wèn)節(jié)點(diǎn)5的時(shí)候,我們是不知道前面經(jīng)過(guò)了哪些節(jié)點(diǎn)的,此時(shí)我們就需要準(zhǔn)備一個(gè)棧,用來(lái)存儲(chǔ)訪問(wèn)過(guò)的節(jié)點(diǎn)。

思路分析

我們舉例來(lái)做分析,如下圖所示,我們準(zhǔn)備了一顆二叉樹和一個(gè)整數(shù)22,通過(guò)觀察后,我們很容易就能看出它有兩條路徑的節(jié)點(diǎn)值加起來(lái)和為22。

  • 10、5、7
  • 10、12

圖片

上述兩個(gè)路徑都是從根節(jié)點(diǎn)出發(fā)到葉子節(jié)點(diǎn)的,也就是說(shuō)路徑總是以根節(jié)點(diǎn)為起始點(diǎn),因此我們首先需要遍歷根節(jié)點(diǎn)。在樹的三種遍歷方式中,只有前序遍歷是首先訪問(wèn)根節(jié)點(diǎn)的。

按照前序遍歷的順序去訪問(wèn)這顆二叉樹,在訪問(wèn)節(jié)點(diǎn)10之后,就會(huì)訪問(wèn)節(jié)點(diǎn)5。圖中二叉樹并沒有指向父節(jié)點(diǎn)的指針,當(dāng)訪問(wèn)節(jié)點(diǎn)5的時(shí)候,我們是不知道前面經(jīng)過(guò)了哪些節(jié)點(diǎn)的,此時(shí)我們就需要準(zhǔn)備一個(gè)棧,用來(lái)存儲(chǔ)訪問(wèn)過(guò)的節(jié)點(diǎn)。

當(dāng)?shù)竭_(dá)節(jié)點(diǎn)5的時(shí)候,路徑中包含兩個(gè)節(jié)點(diǎn):10、5。接下來(lái)遍歷到節(jié)點(diǎn)4,我們把這個(gè)節(jié)點(diǎn)入棧,這時(shí)候已經(jīng)到達(dá)葉節(jié)點(diǎn),但棧中的所有節(jié)點(diǎn)之和是19。這個(gè)和不等于輸入的值22,因此它不符合要求的路徑。

最后,我們要遍歷的節(jié)點(diǎn)是12。在遍歷這個(gè)節(jié)點(diǎn)之前,需要先經(jīng)過(guò)節(jié)點(diǎn)5回到節(jié)點(diǎn)10。同樣的,每次當(dāng)從子節(jié)點(diǎn)回到父節(jié)點(diǎn)的時(shí)候,我們都需要在路徑上刪除子節(jié)點(diǎn)。最后在節(jié)點(diǎn)10到達(dá)節(jié)點(diǎn)12的時(shí)候,路徑上的兩個(gè)節(jié)點(diǎn)的值之和也是22,因此這也是一條符合要求的路徑。

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

遞歸上述過(guò)程,直至二叉樹的所有節(jié)點(diǎn)訪問(wèn)完畢。

圖片

實(shí)現(xiàn)代碼

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

  • 聲明需要的變量:已訪問(wèn)過(guò)的路徑棧、滿足預(yù)期的路徑數(shù)組、當(dāng)前已訪問(wèn)節(jié)點(diǎn)的值總和
  • 從root節(jié)點(diǎn)開始,用前序遍歷訪問(wèn)所有節(jié)點(diǎn),篩選并存儲(chǔ)滿足預(yù)期條件的路徑
  findPath(root: Node<number>, expectedSum: number): Array<string> {
if (root == null) return [];

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

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

// 當(dāng)前節(jié)點(diǎn)不符合條件,將其出棧
pathStack.pop();
}

測(cè)試用例

接下來(lái)我們用文章開頭的例子來(lái)測(cè)試下上述代碼能否正確執(zhí)行。

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);

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

圖片

我們將節(jié)點(diǎn)12改成20,再來(lái)測(cè)試下,結(jié)果如下所示,只有一條路徑符合預(yù)期。

圖片

示例代碼

本文用到的代碼完整版請(qǐng)移步:

  • TreeOperate.ts
  • TreeOperate-test.ts
責(zé)任編輯:武曉燕 來(lái)源: 神奇的程序員
相關(guān)推薦

2021-12-05 18:25:12

二叉樹路徑節(jié)點(diǎn)

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-05-06 17:46:30

二叉樹數(shù)據(jù)結(jié)構(gòu)

2021-04-28 20:12:27

數(shù)據(jù)結(jié)構(gòu)創(chuàng)建

2021-04-19 07:47:42

數(shù)據(jù)結(jié)構(gòu)二叉樹Tree

2021-04-20 08:37:14

數(shù)據(jù)結(jié)構(gòu)二叉樹

2021-08-27 11:36:44

二叉樹回溯節(jié)點(diǎn)

2021-09-29 10:19:00

算法平衡二叉樹

2021-12-17 14:26:58

二叉樹節(jié)點(diǎn)數(shù)量

2020-09-23 18:25:40

算法二叉樹多叉樹

2022-10-26 23:58:02

二叉樹數(shù)組算法

2021-11-29 10:40:58

二叉樹鏡像節(jié)點(diǎn)

2013-07-15 16:35:55

二叉樹迭代器

2021-03-17 08:19:22

二叉樹LeetCode

2021-08-06 11:34:05

二叉樹遞歸回溯

2021-09-15 07:56:32

二叉樹層次遍歷

2021-10-12 09:25:11

二叉樹樹形結(jié)構(gòu)

2022-10-12 23:25:17

二叉樹父節(jié)點(diǎn)根節(jié)點(diǎn)

2021-03-22 08:23:29

LeetCode二叉樹節(jié)點(diǎn)

2023-05-08 15:57:16

二叉樹數(shù)據(jù)結(jié)構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)