最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript判斷對(duì)稱的二叉樹(shù)方案詳解

 更新時(shí)間:2022年09月26日 11:15:21   作者:神奇的程序員  
這篇文章主要為大家介紹了TypeScript判斷對(duì)稱的二叉樹(shù)方案實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

如果一顆二叉樹(shù)和它的鏡像一樣,那么它就是對(duì)稱的。實(shí)現(xiàn)一個(gè)函數(shù)用于判斷一顆二叉樹(shù)是否對(duì)稱,你會(huì)怎么做?

本文將分享一種解決方案,歡迎各位感興趣的開(kāi)發(fā)者閱讀本文。

實(shí)現(xiàn)思路

在上一篇文章二叉樹(shù)的鏡像中我們知道了此問(wèn)題的解決方案是前序遍歷,那么我們可以修改下前序遍歷算法,父節(jié)點(diǎn)遍歷后,先遍歷它的右子節(jié)點(diǎn),再遍歷它的左子節(jié)點(diǎn),我們把這種算法稱為:對(duì)稱前序遍歷

如下圖所示的兩棵樹(shù),我們分別列舉下兩種遍歷的結(jié)果:

  • 樹(shù)A:
    • 前序遍歷:8, 6, 5, 7, 6, 7, 5
    • 對(duì)稱前序遍歷:8, 6, 5, 7, 6, 7, 5
  • 樹(shù)B:
    • 前序遍歷:8, 6, 5, 7, 9, 7, 5
    • 對(duì)稱前序遍歷:8, 9, 5, 7, 6, 7, 5

經(jīng)過(guò)對(duì)比后,我們發(fā)現(xiàn)樹(shù)A的兩種遍歷方法得到的結(jié)果是一樣的,那么它就是對(duì)稱的;樹(shù)B的結(jié)果不同,它就不是對(duì)稱的。

如果有一顆不完全二叉樹(shù),它的所有節(jié)點(diǎn)都相同,他是對(duì)稱的嗎?

針對(duì)于這種情況,我們就需要將它缺省的null節(jié)點(diǎn)進(jìn)行補(bǔ)齊了,補(bǔ)齊后的兩種遍歷結(jié)果為:

  • 前序遍歷:7, 7, 7, null, null, 7, null, null, 7, 7, null, null, null
  • 對(duì)稱前序遍歷:7, 7, null, 7, null, null, 7, 7, null, null, 7, null, null

對(duì)比兩個(gè)結(jié)果后,我們發(fā)現(xiàn)并不一樣,那么它就不是對(duì)稱的。

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

有了思路后,接下來(lái)我們看下代碼實(shí)現(xiàn),如下所示:

  • 從樹(shù)的根節(jié)點(diǎn)出發(fā),遞歸比對(duì)它的左子節(jié)點(diǎn)和右子節(jié)點(diǎn)
  • 比對(duì)過(guò)程中:
    • 二者都到達(dá)葉子結(jié)點(diǎn),代表這棵樹(shù)是對(duì)稱的
    • 任意一方到達(dá)葉子結(jié)點(diǎn),代表這棵樹(shù)不對(duì)稱
    • 節(jié)點(diǎn)值不同,這棵樹(shù)不對(duì)稱
export function SymmetricBinaryTree(node: BinaryTreeNode | null): boolean {
  return isSymmetrical(node, node);
}
function isSymmetrical(
  node: BinaryTreeNode | null | undefined,
  cloneNode: BinaryTreeNode | null | undefined
): boolean {
  // 到達(dá)葉子節(jié)點(diǎn),兩者都為nul代表節(jié)點(diǎn)相同
  if (node == null && cloneNode == null) {
    return true;
  }
  // 任意一方到達(dá)葉子節(jié)點(diǎn),代表節(jié)點(diǎn)不同
  if (node == null || cloneNode == null) {
    return false;
  }
  // 節(jié)點(diǎn)值不同
  if (node.key != cloneNode.key) {
    return false;
  }
  // 分別比對(duì)樹(shù)的左子節(jié)點(diǎn)和右子節(jié)點(diǎn)
  return (
    isSymmetrical(node.left, cloneNode.right) &&
    isSymmetrical(node.right, cloneNode.left)
  );
}

接下來(lái),我們以上個(gè)章節(jié)列舉的例子為例,將其帶入上述代碼,驗(yàn)證下能否正確判斷,如下所示:

const tree: BinaryTreeNode = {
  key: 8,
  left: {
    key: 6,
    left: { key: 5 },
    right: { key: 7 }
  },
  right: { key: 6, left: { key: 7 }, right: { key: 5 } }
};
const isSymmetric = SymmetricBinaryTree(tree);
console.log(tree, "是否為對(duì)稱二叉樹(shù): ", isSymmetric);

示例代碼

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

以上就是TypeScript實(shí)現(xiàn)對(duì)稱的二叉樹(shù)詳解的詳細(xì)內(nèi)容,更多關(guān)于TypeScript 對(duì)稱二叉樹(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解什么是TypeScript里的Constructor?signature

    詳解什么是TypeScript里的Constructor?signature

    這篇文章主要介紹了什么是TypeScript里的Constructor?signature詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • TypeScript快速學(xué)習(xí)入門(mén)基礎(chǔ)語(yǔ)法

    TypeScript快速學(xué)習(xí)入門(mén)基礎(chǔ)語(yǔ)法

    TypeScript的基礎(chǔ)語(yǔ)法,包括變量聲明、復(fù)合類型(數(shù)組和對(duì)象)、條件控制(if-else和switch)、循環(huán)(for和while)、函數(shù)(基礎(chǔ)和箭頭函數(shù),以及可選參數(shù))、面向?qū)ο筇匦裕杜e、接口、繼承)以及模塊開(kāi)發(fā)中的導(dǎo)出和導(dǎo)入
    2024-07-07
  • DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer

    DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer

    這篇文章主要為大家介紹了基于DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer封裝示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • type-challenge刷題(easy部分)示例詳解

    type-challenge刷題(easy部分)示例詳解

    這篇文章主要為大家介紹了type-challenge刷題(easy部分)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Typescript編碼規(guī)范ESLint和Prettier使用示例詳解

    Typescript編碼規(guī)范ESLint和Prettier使用示例詳解

    這篇文章主要介紹了Typescript編碼規(guī)范ESLint和Prettier使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • TypeScript之Generics泛型類型學(xué)習(xí)

    TypeScript之Generics泛型類型學(xué)習(xí)

    這篇文章主要為大家介紹了TypeScript之Generics泛型類型學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Nest框架中集成使用Swagger示例說(shuō)明

    Nest框架中集成使用Swagger示例說(shuō)明

    這篇文章主要為大家介紹了Nest框架中集成使用Swagger的示例說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Rollup 簡(jiǎn)易入門(mén)示例教程

    Rollup 簡(jiǎn)易入門(mén)示例教程

    這篇文章主要為大家介紹了Rollup 簡(jiǎn)易入門(mén)示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • postman數(shù)據(jù)加解密實(shí)現(xiàn)APP登入接口模擬請(qǐng)求

    postman數(shù)據(jù)加解密實(shí)現(xiàn)APP登入接口模擬請(qǐng)求

    對(duì)于Postman的使用,一般情況下只要發(fā)發(fā)確定的請(qǐng)求與參數(shù)就可以的了,然而,在使用的時(shí)候,尤其是接口測(cè)試時(shí),請(qǐng)求接口的設(shè)計(jì)里面都有數(shù)據(jù)加密,參數(shù)驗(yàn)簽,返回?cái)?shù)據(jù)也有進(jìn)行加密的,這個(gè)時(shí)候就需要使用一些腳本做處理,模擬app登入請(qǐng)求的操作
    2021-08-08
  • TypeScript實(shí)現(xiàn)類型安全的EventEmitter

    TypeScript實(shí)現(xiàn)類型安全的EventEmitter

    這篇文章主要為大家介紹了TypeScript實(shí)現(xiàn)類型安全的EventEmitter示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論

天台县| 壶关县| 武夷山市| 静海县| 宜城市| 阳江市| 济宁市| 邵阳县| 三江| 宜城市| 延长县| 泗水县| 岳普湖县| 通江县| 乌兰县| 嘉祥县| 鄄城县| 咸丰县| 邵阳市| 南漳县| 衡山县| 昌乐县| 富锦市| 观塘区| 和平区| 墨玉县| 舟曲县| 平利县| 崇左市| 漠河县| 石阡县| 沁阳市| 娄烦县| 公安县| 武清区| 湖北省| 邮箱| 泸西县| 清水河县| 丹棱县| 肇源县|