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

一篇學會樹的子結構

開發 前端
在我的數據結構與算法實現系列文章——實現二叉搜索樹中,我們知道了二叉樹最多只能有兩個子節點:左子節點、右子節點。

前言

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

思路分析

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

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

如果樹A的節點與樹B的根結點相同,則執行進一步的判斷(比對兩棵樹的子結構)得出比對結果

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

  • 判斷樹A中以R為根節點的子樹是否包含和樹B一樣的結構

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

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

如果比對的兩個節點不等,則代表當前A的子樹中不包含樹B結構,返回false

否則,繼續執行遞歸,直至任意一棵樹的葉子節點

圖片

實現代碼

通過上個章節的分析,我們已經得出了具體的思路,接下來,我們就將思路轉換為代碼,如下所示:

實現主函數,判斷B是否為A的子結構:

遞歸樹A將其與樹B的節點進行比對,找到相同的節點再做進一步的比對

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

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

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

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

測試用例

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

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
責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2022-03-14 08:16:00

Java程序開發

2021-11-29 10:40:58

二叉樹鏡像節點

2021-12-17 14:26:58

二叉樹節點數量

2022-02-07 11:01:23

ZooKeeper

2022-01-02 08:43:46

Python

2021-10-26 10:40:26

代理模式虛擬

2022-05-17 08:02:55

GoTryLock模式

2021-12-04 22:05:02

Linux

2021-08-01 07:19:16

語言OpenrestyNginx

2021-07-02 08:51:29

源碼參數Thread

2021-09-28 08:59:30

復原IP地址

2021-10-14 10:22:19

逃逸JVM性能

2022-04-12 08:30:52

回調函數代碼調試

2021-10-27 09:59:35

存儲

2021-07-16 22:43:10

Go并發Golang

2023-03-13 21:38:08

TCP數據IP地址

2023-11-01 09:07:01

Spring裝配源碼

2022-10-20 07:39:26

2022-03-11 10:21:30

IO系統日志

2021-04-29 10:18:18

循環依賴數組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚州午夜精品 | 欧美精品啪啪 | 国产亚洲精品久久久优势 | 国产成人高清成人av片在线看 | 日韩a| 懂色一区二区三区免费观看 | 国产东北一级毛片 | 91亚洲国产成人精品一区二三 | 国产精品毛片无码 | 91视频在线看 | 黄色在线观看国产 | 午夜视频一区 | 国产做a爱免费视频 | 亚洲精品久久久久久国产精华液 | 欧美在线视频一区 | 99婷婷 | 国产一区二区激情视频 | 亚洲精品电影在线观看 | 国产成人福利在线 | 国产不卡一区在线观看 | 狠狠天天 | 成人精品| 成人在线观看免费爱爱 | 国产福利在线视频 | 婷婷综合五月天 | 午夜久久久 | 日韩精品一区二区三区在线 | 黄网站涩免费蜜桃网站 | 日本网站免费在线观看 | 国产91在线 | 亚洲 | 亚洲国产一区二区视频 | 精品欧美一区免费观看α√ | 国产小视频在线 | 亚洲精品久久久久久久久久久久久 | 中文字幕乱码一区二区三区 | 国产精品一区二区视频 | 水蜜桃久久夜色精品一区 | 色婷婷精品久久二区二区蜜臂av | 久久久精品网站 | 2018天天干天天操 | 国产高清视频 |