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

一篇學(xué)會樹的子結(jié)構(gòu)

開發(fā) 前端
在我的數(shù)據(jù)結(jié)構(gòu)與算法實現(xiàn)系列文章——實現(xiàn)二叉搜索樹中,我們知道了二叉樹最多只能有兩個子節(jié)點:左子節(jié)點、右子節(jié)點。

前言

給定兩顆二叉樹A和B,如何判斷B是不是A的子結(jié)構(gòu),本文將分享一個方案用來解決此問題,歡迎各位感興趣的開發(fā)者閱讀本文。

思路分析

在我的數(shù)據(jù)結(jié)構(gòu)與算法實現(xiàn)系列文章——實現(xiàn)二叉搜索樹中,我們知道了二叉樹最多只能有兩個子節(jié)點:左子節(jié)點、右子節(jié)點。那么,在本題中要判斷是否包含,可以分為兩步來實現(xiàn):

  • 在樹A中找到和樹B的根節(jié)點的值一樣的節(jié)點R

如果樹A的節(jié)點與樹B的根結(jié)點相同,則執(zhí)行進(jìn)一步的判斷(比對兩棵樹的子結(jié)構(gòu))得出比對結(jié)果

如果得出的結(jié)果為false,分別遞歸樹A的左子節(jié)點與右子節(jié)點跟樹B進(jìn)行比對,直至任意一棵樹的葉子節(jié)點

  • 判斷樹A中以R為根節(jié)點的子樹是否包含和樹B一樣的結(jié)構(gòu)

如果樹B為null則代表樹A中包含樹B,返回true

如果樹A為null則代表樹A中不包含樹B,返回false

如果比對的兩個節(jié)點不等,則代表當(dāng)前A的子樹中不包含樹B結(jié)構(gòu),返回false

否則,繼續(xù)執(zhí)行遞歸,直至任意一棵樹的葉子節(jié)點

圖片

實現(xiàn)代碼

通過上個章節(jié)的分析,我們已經(jīng)得出了具體的思路,接下來,我們就將思路轉(zhuǎn)換為代碼,如下所示:

實現(xiàn)主函數(shù),判斷B是否為A的子結(jié)構(gòu):

遞歸樹A將其與樹B的節(jié)點進(jìn)行比對,找到相同的節(jié)點再做進(jìn)一步的比對

export function TreeSubstructure(
treeA: BinaryTreeNode | null | undefined,
treeB: BinaryTreeNode | null | undefined
): boolean {
let result = false;
if (treeA != null && treeB != null) {
// 兩個節(jié)點相同
if (treeA.key === treeB.key) {
// 判斷樹A中是否包含樹B
result = treeAHaveTreeB(treeA, treeB);
}

// 繼續(xù)尋找左子樹與右子樹
if (!result) {
result = TreeSubstructure(treeA?.left, treeB);
}
if (!result) {
result = TreeSubstructure(treeA?.right, treeB);
}
}
return result;
}
  • 實現(xiàn)進(jìn)一步的比對函數(shù),判斷樹A的子節(jié)點中是否包含跟樹B一樣的結(jié)構(gòu)
function treeAHaveTreeB(
treeA: BinaryTreeNode | null | undefined,
treeB: BinaryTreeNode | null | undefined
): boolean {
// 遞歸到了樹B的葉節(jié)點,代表該節(jié)點存在于樹A中
if (treeB == null) {
return true;
}
// 遞歸到樹A的葉節(jié)點,代表該節(jié)點不存在于樹A中
if (treeA == null) {
return false;
}
if (treeA.key !== treeB.key) {
return false;
}
// 左子樹與右子樹都相同
return (
treeAHaveTreeB(treeA?.left, treeB?.left) &&
treeAHaveTreeB(treeA?.right, treeB?.right)
);
}

注意:上述代碼中用到了遞歸,如果你對其不了解,可以移步我的另一篇文章:遞歸的理解與實現(xiàn)

代碼中還用到了一個自定義類型BinaryTreeNode,具體的類型定義請移步示例代碼章節(jié)。

測試用例

接下來,我們用思路分析章節(jié)中所舉的例子來測試下上述函數(shù)能否正確執(zhí)行。

const treeA: BinaryTreeNode = {
key: 8,
left: {
key: 8,
left: { key: 9 },
right: { key: 2, left: { key: 4 }, right: { key: 7 } }
},
right: { key: 7 }
};

const treeB: BinaryTreeNode = {
key: 8,
left: {
key: 9
},
right: {
key: 2
}
};

const result = TreeSubstructure(treeA, treeB);
console.log("treeA中包含treeB", result);

圖片

示例代碼

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

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

2022-03-14 08:16:00

Java程序開發(fā)

2021-11-29 10:40:58

二叉樹鏡像節(jié)點

2021-12-17 14:26:58

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

2022-01-02 08:43:46

Python

2021-08-01 07:19:16

語言OpenrestyNginx

2022-02-07 11:01:23

ZooKeeper

2021-05-11 08:54:59

建造者模式設(shè)計

2021-07-02 09:45:29

MySQL InnoDB數(shù)據(jù)

2021-07-06 08:59:18

抽象工廠模式

2023-01-03 08:31:54

Spring讀取器配置

2022-08-26 09:29:01

Kubernetes策略Master

2021-07-05 22:11:38

MySQL體系架構(gòu)

2023-11-28 08:29:31

Rust內(nèi)存布局

2022-08-23 08:00:59

磁盤性能網(wǎng)絡(luò)

2021-10-26 10:40:26

代理模式虛擬

2022-05-17 08:02:55

GoTryLock模式

2021-12-04 22:05:02

Linux

2022-01-12 07:36:01

Java數(shù)據(jù)ByteBuffer

2021-07-02 08:51:29

源碼參數(shù)Thread

2021-09-28 08:59:30

復(fù)原IP地址
點贊
收藏

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

主站蜘蛛池模板: 国产一级在线 | 欧美成人精品在线观看 | 性色av一区二区三区 | 精品在线一区二区三区 | 久久久国产一区二区三区 | 在线观看免费黄色片 | 日韩欧美三区 | 久久久国产精品视频 | www亚洲免费国内精品 | 欧美精品久久久久 | 看av电影 | 中文字幕不卡 | 密室大逃脱第六季大神版在线观看 | 亚洲天堂日韩精品 | 国产欧美一区二区三区在线看 | 亚洲 欧美 日韩 在线 | 中文字幕一区在线 | 亚洲成人精 | 91国产视频在线观看 | 毛片区 | 亚洲综合一区二区三区 | 欧美一区二区在线 | 91麻豆精品一区二区三区 | 97超级碰碰 | 欧美一级视频 | 九九综合九九 | 免费毛片www com cn | 欧美一区不卡 | 精品日韩在线 | 国产情侣一区 | 亚洲视频一区 | 国产免费播放视频 | 精品伦精品一区二区三区视频 | 老牛影视av一区二区在线观看 | 一区二区在线观看免费视频 | 999热视频| 精品一区二区三区四区视频 | 亚洲国产精品一区二区第一页 | 日韩在线中文字幕 | 亚洲欧美综合精品久久成人 | 久久99精品久久 |