日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一篇學(xué)會(huì)樹(shù)的子結(jié)構(gòu)

前言

思路分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

測(cè)試用例

接下來(lái),我們用思路分析章節(jié)中所舉的例子來(lái)測(cè)試下上述函數(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);

示例代碼

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

  • TreeSubstructure.ts
  • TreeSubstructure-test

網(wǎng)頁(yè)題目:一篇學(xué)會(huì)樹(shù)的子結(jié)構(gòu)
網(wǎng)站路徑:http://m.5511xx.com/article/dpshdpi.html