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

二叉樹的后序遍歷序列

開發 前端
有一個整數數組,如何判斷該數組是不是某個二叉樹的后序遍歷結果?本文就跟大家分享下這個算法。

前言

有一個整數數組,如何判斷該數組是不是某個二叉樹的后序遍歷結果?本文就跟大家分享下這個算法,歡迎各位感興趣的開發者閱讀本文。

思路分析

我們通過一個例子來分析這個問題,如下所示為一顆二叉樹。

圖片

通過之前文章的學習(二叉樹的后序遍歷),我們可以很快看出這顆樹的后序遍歷序列為: [5, 7, 6, 9, 11, 10, 8],通過觀察后我們發現最后一個數字為二叉樹的根節點,數組中前面的數字可以分為兩部分:

第一部分是左子樹節點的值,它們都比根節點的值小

第二部分是右子樹節點的值,它們都比根節點的值大

在上面的后序遍歷結果數組中,前3個數字5、7、6?都比根節點8小,是它的左子樹節點;后3個數字9、11、10都比根節點8大,是它的右子樹節點。

那么,我們就可以用同樣的方法來確定數組每一部分對應的子樹的結構。

數組5, 7, 6,最后一個數字6是左子樹的根節點的值。數字5比6小,是6的左子節點,7則是它的右子節點

數組9, 11, 10,最后一個數字10是左子樹的根節點的值。數字9比10小,是10的左子節點,11則是它的右子節點

實現思路

通過上面的分析,我們便可以總結出實現思路了。

最后一項一定是根節點,從根節點前面的值中尋找左、右子樹的分界點

定義指針leftIndex,前半部分一定是它的左子樹,每個節點的值都比根節點小

leftIndex默認從0開始,逐漸遞增,尋找比根節點大的值,便是它們的分界點

定義指針rightIndex,后半部分一定是它的右子樹,每個節點的值都比根節點大。

rightIndex從分界點開始找(默認從leftIndex位置開始),如果有比根節點小的值,那么這個序列一定不屬于二叉樹的后序遍歷序列

如果leftIndex指針離開了起始位置(0),證明它的左子節點還沒找完,需要重復執行上述過程繼續查找(遞歸尋找到數組的leftIndex位置)

如果leftIndex指針沒有到達數組末尾,證明它的右子節點還沒找完,需要重復執行上述過程繼續查找(從leftIndex+1位置開始遞歸)

返回左、右子樹的遞歸校驗結果(兩者都為true則表示這個序列為二叉樹的后序遍歷序列)

圖片

實現代碼

捋清楚思路后,我們便可以順利的寫出代碼了。

  verifySequenceOfBST(sequence: Array<number>, length: number): boolean {
if (sequence == null || length <= 0) return false;
const root = sequence[length - 1];
// 左子樹節點的值小于根節點的值
let leftIndex = 0;
for (; leftIndex < length - 1; leftIndex++) {
if (sequence[leftIndex] > root) {
break;
}
}
// 右子樹節點的值大于根節點的值
let rightIndex = leftIndex;
for (; rightIndex < length - 1; rightIndex++) {
if (sequence[rightIndex] < root) {
return false;
}
}

// 判斷左子樹是否為二叉樹
let leftVerify = true;
if (leftIndex > 0) {
leftVerify = this.verifySequenceOfBST(sequence, leftIndex);
}
let rightVerify = true;
if (leftIndex < length - 1) {
rightVerify = this.verifySequenceOfBST(
sequence.slice(leftIndex + 1),
length - leftIndex - 1
);
}
return leftVerify && rightVerify;
}

測試用例

接下來我們將思路分析中所列舉的例子代入上述代碼,來驗證下我們的代碼能否正確執行。

const arr = [5, 7, 6, 9, 11, 10, 8];
console.log("比對結果", treeOperateTest.verifySequenceOfBST(arr, arr.length));

圖片

我們再列舉一個錯誤的例子,來驗證下它能否正確判斷。

const arr = [7, 4, 6, 5];
console.log("比對結果", treeOperateTest.verifySequenceOfBST(arr, arr.length));

圖片

示例代碼

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

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

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-08-17 11:32:33

二叉樹數據結構算法

2021-04-20 08:37:14

數據結構二叉樹

2023-05-08 15:57:16

二叉樹數據結構

2021-09-15 07:56:32

二叉樹層次遍歷

2009-08-11 13:29:57

C#二叉樹遍歷

2021-01-13 10:03:36

二叉樹層序遍歷層次遍歷

2021-04-19 07:47:42

數據結構二叉樹Tree

2021-04-28 20:12:27

數據結構創建

2021-08-27 11:36:44

二叉樹回溯節點

2021-07-13 11:32:41

二叉樹數據結構算法

2021-09-29 10:19:00

算法平衡二叉樹

2024-01-23 12:54:00

C++編程語言代碼

2013-07-15 16:35:55

二叉樹迭代器

2021-03-17 08:19:22

二叉樹LeetCode

2020-09-23 18:25:40

算法二叉樹多叉樹

2021-09-15 07:40:50

二叉樹數據結構算法

2021-10-12 09:25:11

二叉樹樹形結構

2021-03-22 08:23:29

LeetCode二叉樹節點

2023-02-01 07:27:46

序列化二叉樹根節點
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色网址在线播放 | 久久久亚洲精品视频 | 亚洲精品小视频在线观看 | 久久高清精品 | 性在线| 中文在线一区二区 | 国产精品一区二区免费 | 一级做a爰片性色毛片视频停止 | 亚洲一区二区三区免费在线观看 | 久免费视频 | 亚洲国产精品久久久 | 精品欧美一区二区精品久久 | 黄色片在线网站 | 91免费在线| 国产一区二区在线免费播放 | 国产精品美女久久久久久久久久久 | 久久9热 | 日韩欧美理论片 | 欧美第一页 | 亚洲国产精品久久久 | 成人av网站在线观看 | 黄色网址在线免费观看 | 一级免费看片 | 五月婷亚洲 | 久久精品av | 国产日韩一区二区三免费高清 | 成人小视频在线观看 | 最新国产福利在线 | 国产一区二区在线91 | 午夜看片网站 | 最新中文字幕在线 | 国产视频91在线 | 97国产精品| 中文字幕国产一区 | 国产高清在线精品一区二区三区 | 国产精品亚洲一区二区三区在线 | 精品久久久久久久久久久久久 | 欧洲av一区| 中文字幕日韩专区 | 97热在线| 久久久性|