精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

尋找二叉樹的下一個節點

開發 前端
已知一個包含父節點引用的二叉樹和其中的一個節點,如何找出這個節點中序遍歷序列的下一個節點?

本文轉載自微信公眾號「神奇的程序員k」,作者神奇的程序員K。轉載本文請聯系神奇的程序員k公眾號。  

前言

已知一個包含父節點引用的二叉樹和其中的一個節點,如何找出這個節點中序遍歷序列的下一個節點?

本文就跟大家分享下這個問題的解決方案與實現代碼,歡迎各位感興趣的開發者閱讀本文。

問題分析

正如前言所述,我們的已知條件如下:

  • 包含父節點引用的二叉樹
  • 要查找的節點

我們要解決的問題:

  • 找出要查找節點中序遍歷序列的下一個節點

接下來,我們通過舉例來推導下一個節點的規律,我們先來畫一顆二叉搜索樹,如下所示:

  1.  
  2.    / \ 
  3.   6   13 
  4.  / \  / \ 
  5. 3  7 9  15 

例如,我們尋找6的下一個節點,根據中序遍歷的規則我們可知它的下一個節點是7

  • 8的下一個節點是9
  • 3的下一個節點是6
  • 7的下一個節點是8

通過上述例子,我們可以分析出下述信息:

  • 要查找的節點存在右子樹,那么它的下一個節點就是其右子樹中的最左子節點
  • 要查找的節點不存右子樹:
    • 當前節點屬于父節點的左子節點,那么它的下一個節點就是其父節點本身
    • 當前節點屬于父節點的右子節點,那么就需要沿著父節點的指針一直向上遍歷,直至找到一個是它父節點的左子節點的節點

上述規律可能有點繞,大家可以將規律代入問題中多驗證幾次,就能理解了。

實現思路

  • 二叉樹中插入節點時保存其父節點的引用
  • 調用二叉樹的搜索節點方法,找到要查找的節點信息
  • 判斷找到的節點是否存在右子樹
  • 如果存在,則遍歷它的左子樹至葉節點,將其返回。
  • 如果不存在,則遍歷它的父節點至根節點,直至找到一個節點與它父節點的左子節點相等的節點,將其返回。

實現代碼

接下來,我們將上述思路轉換為代碼,本文代碼中用到的二叉樹相關實現請移步我的另一篇文章:TypeScript實現二叉搜索樹

搜索要查找的節點

我們需要找到要查找節點在二叉樹中的節點信息,才能繼續實現后續步驟,搜索節點的代碼如下:

  1. import { Node } from "./Node.ts"
  2.  
  3. export default class BinarySearchTree<T> { 
  4.     protected root: Node<T> | undefined; 
  5.  
  6.     constructor(protected compareFn: ICompareFunction<T> = defaultCompare) { 
  7.         this.root = undefined; 
  8.     } 
  9.    
  10.     // 搜索特定值 
  11.     search(key: T): boolean | Node<T> { 
  12.         return this.searchNode(<Node<T>>this.root, key); 
  13.     } 
  14.  
  15.     // 搜索節點 
  16.     private searchNode(node: Node<T>, key: T): boolean | Node<T> { 
  17.         if (node == null) { 
  18.             return false
  19.         } 
  20.  
  21.         if (this.compareFn(key, node.key) === Compare.LESS_THAN) { 
  22.             // 要查找的key在節點的左側 
  23.             return this.searchNode(<Node<T>>node.leftkey); 
  24.         } else if (this.compareFn(key, node.key) === Compare.BIGGER_THAN) { 
  25.             // 要查找的key在節點的右側 
  26.             return this.searchNode(<Node<T>>node.rightkey); 
  27.         } else { 
  28.             // 節點已找到 
  29.             return node; 
  30.         } 
  31.     } 

保存父節點引用

此處的二叉樹與我們實現的二叉樹稍有不同,插入節點時需要保存父節點的引用,實現代碼如下:

  1. export default class BinarySearchTree<T> { 
  2.     // 插入方法 
  3.     insert(key: T): void { 
  4.         if (this.root == null) { 
  5.             // 如果根節點不存在則直接新建一個節點 
  6.             this.root = new Node(key); 
  7.         } else { 
  8.             // 在根節點中找合適的位置插入子節點 
  9.             this.insertNode(this.root, key); 
  10.         } 
  11.     } 
  12.    
  13.     // 節點插入 
  14.     protected insertNode(node: Node<T>, key: T): void { 
  15.         // 新節點的鍵小于當前節點的鍵,則將新節點插入當前節點的左邊 
  16.         // 新節點的鍵大于當前節點的鍵,則將新節點插入當前節點的右邊 
  17.         if (this.compareFn(key, node.key) === Compare.LESS_THAN) { 
  18.             if (node.left == null) { 
  19.                 // 當前節點的左子樹為null直接插入 
  20.                 node.left = new Node(key, node); 
  21.             } else { 
  22.                 // 從當前節點(左子樹)向下遞歸,找到null位置將其插入 
  23.                 this.insertNode(node.leftkey); 
  24.             } 
  25.         } else { 
  26.             if (node.right == null) { 
  27.                 // 當前節點的右子樹為null直接插入 
  28.                 node.right = new Node(key, node); 
  29.             } else { 
  30.                 // 從當前節點(右子樹)向下遞歸,找到null位置將其插入 
  31.                 this.insertNode(node.rightkey); 
  32.             } 
  33.         } 
  34.     } 
  35.  
  36. /** 
  37.  * 二叉樹的輔助類: 用于存儲二叉樹的每個節點 
  38.  */ 
  39. export class Node<K> { 
  40.     public left: Node<K> | undefined; 
  41.     public right: Node<K> | undefined; 
  42.     public parent: Node<K> | undefined; 
  43.     constructor(public key: K, parent?: Node<K>) { 
  44.         this.left = undefined; 
  45.         this.right = undefined; 
  46.         console.log(key"的父節點", parent?.key); 
  47.         this.parent = parent; 
  48.     } 
  49.  
  50.     toString(): string { 
  51.         return `${this.key}`; 
  52.     } 

我們來測試下上述代碼,驗證下父節點引用是否成功:

  1. const tree = new BinarySearchTree(); 
  2. tree.insert(8); 
  3. tree.insert(6); 
  4. tree.insert(3); 
  5. tree.insert(7); 
  6. tree.insert(13); 
  7. tree.insert(9); 
  8. tree.insert(15); 

 

在保存父節點引用時折騰了好久也沒實現,最后求助了我的朋友_Dreams😁。

尋找下一個節點

接下來,我們就可以根據節點的規律來實現這個算法了,實現代碼如下:

  1. export class TreeOperate<T> { 
  2.     /** 
  3.      * 尋找二叉樹的下一個節點 
  4.      * 規則: 
  5.      *  1. 輸入一個包含父節點引用的二叉樹和其中的一個節點 
  6.      *  2. 找出這個節點中序遍歷序列的下一個節點 
  7.      * 
  8.      * 例如: 
  9.      *       8 
  10.      *      / \ 
  11.      *     6   13 
  12.      *    / \  / \ 
  13.      *   3  7 9  15 
  14.      * 
  15.      * 6的下一個節點是7,8的下一個節點是9 
  16.      * 
  17.      * 通過分析,我們可以得到下述信息: 
  18.      *  1. 如果一個節點有右子樹,那么它的下一個節點就是其右子樹中的最左子節點 
  19.      *  2. 如果一個節點沒有右子樹: 
  20.      *  (1). 當前節點屬于父節點的左子節點,那么它的下一個節點就是其父節點本身 
  21.      *  (2). 當前節點屬于父節點的右子節點,沿著父節點的指針一直向上遍歷,直至找到一個是它父節點的左子節點的節點 
  22.      * 
  23.      */ 
  24.     findBinaryTreeNextNode(tree: BinarySearchTree<number>, node: number): null | Node<number> { 
  25.         // 搜索節點 
  26.         const result: Node<number> | boolean = tree.search(node); 
  27.         if (result == null) throw "節點不存在"
  28.         let currentNode = result as Node<number>; 
  29.         // 右子樹存在 
  30.         if (currentNode.right) { 
  31.             currentNode = currentNode.right
  32.             // 取右子樹的最左子節點 
  33.             while (currentNode.left) { 
  34.                 currentNode = currentNode.left
  35.             } 
  36.             return currentNode; 
  37.         } 
  38.  
  39.         // 右子樹不存在 
  40.         while (currentNode.parent) { 
  41.             // 當前節點等于它父節點的左子節點則條件成立 
  42.             if (currentNode === currentNode.parent.left) { 
  43.                 return currentNode.parent; 
  44.             } 
  45.             // 條件不成立,繼續獲取它的父節點 
  46.             currentNode = currentNode.parent; 
  47.         } 
  48.         return null
  49.     } 

我們通過一個例子來測試下上述代碼:

  1. // 構建二叉搜索樹 
  2. const tree = new BinarySearchTree(); 
  3. tree.insert(8); 
  4. tree.insert(6); 
  5. tree.insert(3); 
  6. tree.insert(7); 
  7. tree.insert(13); 
  8. tree.insert(9); 
  9. tree.insert(15); 
  10. // 尋找下一個節點 
  11. const nextNode = treeOperate.findBinaryTreeNextNode(tree, 7); 
  12. console.log("7的下一個節點", nextNode.toString()); 

 

 

 

 

代碼地址

文中完整代碼如下:

  • TreeOperate.ts
  • BinarySearchTree.ts

 

責任編輯:武曉燕 來源: 神奇的程序員k
相關推薦

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-07-16 08:57:31

迭代遍歷二叉樹

2021-05-06 17:46:30

二叉樹數據結構

2021-04-19 07:47:42

數據結構二叉樹Tree

2021-04-20 08:37:14

數據結構二叉樹

2021-04-28 20:12:27

數據結構創建

2021-08-27 11:36:44

二叉樹回溯節點

2022-10-26 23:58:02

二叉樹數組算法

2021-11-29 10:40:58

二叉樹鏡像節點

2021-09-29 10:19:00

算法平衡二叉樹

2021-12-17 14:26:58

二叉樹節點數量

2021-03-17 08:19:22

二叉樹LeetCode

2013-07-15 16:35:55

二叉樹迭代器

2020-09-23 18:25:40

算法二叉樹多叉樹

2021-12-05 18:25:12

二叉樹路徑節點

2022-07-27 07:45:53

二叉樹鏡像函數

2022-11-06 19:43:10

二叉樹指針節點

2021-10-12 09:25:11

二叉樹樹形結構

2021-09-15 07:56:32

二叉樹層次遍歷

2018-03-15 08:31:57

二叉樹存儲結構
點贊
收藏

51CTO技術棧公眾號

国产91精品一区二区麻豆网站| 欧美色图一区| 五月婷婷另类国产| 欧美第一黄网| 国产又粗又黄又爽的视频| 天天综合国产| 亚洲激情自拍图| 在线黄色免费观看| 51漫画成人app入口| 久久久久久久久97黄色工厂| 成人性生交大片免费观看嘿嘿视频| 青青操视频在线播放| 偷拍一区二区| 日韩视频在线一区二区| 日韩av三级在线| 亚洲成人三级| 国产盗摄一区二区三区| 国产91色在线|免| 欧美精品xxxxx| 成人情趣视频网站| 精品国产乱码久久久久久免费| 欧美国产日韩在线播放| 四虎亚洲成人| 国产精品美女久久久久久久| 久久精品99久久| 国产麻豆91视频| 丝袜美腿亚洲色图| 性色av一区二区三区| 精品国产无码在线观看| 日本高清久久| 欧美三区免费完整视频在线观看| 欧美乱大交xxxxx潮喷l头像| 久久国产精品一区| 国产亚洲午夜高清国产拍精品| 99在线影院| 一区二区久久精品66国产精品 | 欧美另类videos| 国产色a在线| 91免费国产在线| 成人xxxxx色| www.成人免费视频| 国产一区二区不卡| 成人国产精品一区二区| 波多野结衣在线电影| 日韩视频免费| 韩国日本不卡在线| 久久国产免费观看| 欧美激情 亚洲a∨综合| 久久韩国免费视频| 国产福利在线导航| 国产亚洲欧美日韩在线观看一区二区| 亚洲国产精品系列| 美女露出粉嫩尿囗让男人桶| 欧美中文高清| 日韩欧美成人一区| 中文字幕乱码在线人视频| 亚洲国产伊人| 这里只有精品免费| 久久精品国产露脸对白| 亚洲热av色在线播放| 欧美日韩夫妻久久| 在线观看岛国av| av日韩在线免费观看| 欧美日本在线播放| 欧美精品 - 色网| 大胆国模一区二区三区| 日韩一区二区三区精品视频| 手机在线观看日韩av| 欧美a级大片在线| 日韩欧美色综合| 日韩少妇一区二区| 欧美wwwwww| 亚洲日本aⅴ片在线观看香蕉| 亚洲av无码成人精品国产| 亚洲自拍电影| 最近2019好看的中文字幕免费| 国产视频不卡在线| 围产精品久久久久久久| 欧美黑人巨大精品一区二区| 日韩精品一区二区三区国语自制| 夜久久久久久| 国产精品成av人在线视午夜片| 成人黄色片在线观看 | 美女日批在线观看| 开心激情综合| 中文字幕欧美亚洲| 欧美日韩偷拍视频| 欧美亚洲一区二区三区| 国产精品久久久久不卡| jizz中国少妇| 91在线高清观看| 一本一本久久a久久精品综合妖精| 国产在线观看a| 亚洲va在线va天堂| 天堂中文视频在线| 一区二区三区四区视频免费观看| 日韩av中文字幕在线| 欧美精品日韩在线| 国产一区二区中文| 国产精品欧美一区二区| 国模人体一区二区| 国产欧美一区二区在线| 日本aa在线观看| 亚洲成人激情社区| 精品乱人伦一区二区三区| 亚洲第一成人网站| 欧美激情综合色综合啪啪| 日本国产一区二区三区| 一级α片免费看刺激高潮视频| 成人少妇影院yyyy| 亚洲国产精品一区在线观看不卡| 美女91在线| 欧美日韩高清不卡| 美女100%无挡| 激情偷拍久久| 成人免费看黄网站| 国产永久免费高清在线观看| 亚洲一级不卡视频| 欧美日韩一区二区三区69堂| 视频福利一区| 久久久久久999| 国产精品玖玖玖| 久久久国产精品麻豆| 国产一线二线三线女| 日本午夜精品久久久久| 亚洲精品一区二区网址| 久一视频在线观看| 国产在线精品不卡| 亚洲开发第一视频在线播放| 亚洲欧美电影| 亚洲国产天堂久久综合网| 国产免费无码一区二区视频| 美腿丝袜亚洲色图| 欧美一区二区三区四区在线观看地址| 狂野欧美性猛交xxxxx视频| 欧美片网站yy| 麻豆一区在线观看| 日韩精品电影在线| 欧美自拍资源在线| 中文字幕高清在线播放| 亚洲国产精品人久久电影| 黄色一级视频在线观看| 国产综合色精品一区二区三区| 四虎永久国产精品| 国产韩日精品| 在线精品91av| 中文字幕你懂的| 欧美经典三级视频一区二区三区| 黑森林福利视频导航| 香蕉视频免费在线看| 亚洲欧美视频在线观看| 久久午夜夜伦鲁鲁一区二区| 亚洲伊人春色| 国产精品wwwwww| 北岛玲一区二区三区| 欧美这里有精品| 美国黄色特级片| 毛片一区二区三区| 亚洲精品中字| 日韩高清在线观看一区二区| 欧美精品一区在线播放| 国产男女猛烈无遮挡| 一区二区三区产品免费精品久久75| 久久精品视频在线观看免费| 国产一区二区三区自拍| 国产视频99| 樱花草涩涩www在线播放| 亚洲精品一区二区三区婷婷月| 99久久久无码国产精品免费蜜柚| 国产亚洲欧美一级| 91小视频网站| 欧美韩日精品| 久久久亚洲综合网站| 欧美日韩视频免费观看| 日韩中文在线中文网三级| 精品国产18久久久久久| 亚洲香蕉伊在人在线观| 中文字幕在线免费看线人| 日日嗨av一区二区三区四区| 日韩黄色影视| 国产美女精品视频免费播放软件| 欧美激情视频网址| 精品视频二区| 日韩欧美一级片| 日韩人妻精品中文字幕| 国产精品大尺度| fc2成人免费视频| 视频在线观看一区二区三区| 97超碰人人爱| 欧美a一欧美| 成人精品久久久| 午夜激情在线播放| 精品久久国产精品| 青青草视频在线观看| 欧美日韩成人综合| 国产一级二级三级视频| 久久久噜噜噜久久中文字幕色伊伊 | 国产日韩欧美在线视频观看| 国产丝袜在线播放| 国产亚洲精品va在线观看| 精品国产999久久久免费| 日韩欧美视频一区二区三区| 黄色片在线观看网站| 久久尤物电影视频在线观看| 久久精品亚洲天堂| 久热综合在线亚洲精品| 免费网站永久免费观看| 日韩精品免费| 久久久一本精品99久久精品| 国产精品亚洲欧美日韩一区在线 | 91美女视频网站| 日韩av加勒比| 日韩不卡在线观看日韩不卡视频| 日韩成人手机在线| 久久免费大视频| 欧美亚洲另类在线一区二区三区| 日韩欧美另类中文字幕| 国产精品久久激情| 人成在线免费网站| 色综合久久88| 日本电影在线观看网站| 亚洲区在线播放| 五月激情六月婷婷| 欧美一区二区大片| 中国一级片黄色一级片黄| 日韩欧美在线字幕| 日韩乱码在线观看| 亚洲一区在线播放| 黑人巨大精品一区二区在线| 国产精品视频在线看| 在线观看福利片| 99热99精品| 一起草在线视频| av电影在线观看不卡| www日本在线观看| 国产高清精品在线| av在线免费观看不卡| 狠狠色丁香久久婷婷综合_中| 香蕉视频网站入口| 日韩黄色免费网站| 老司机午夜av| 秋霞国产午夜精品免费视频| 手机看片福利盒子久久| 美女久久网站| 久久久精品三级| 日韩电影免费在线看| 麻豆av免费在线| 日韩一区精品视频| 波多结衣在线观看| 麻豆久久久久久| 99九九99九九九99九他书对| 久久机这里只有精品| 四季av一区二区三区| 国产美女在线精品| 2025中文字幕| 99久久久免费精品国产一区二区| 中文字幕免费在线播放| 成人av在线资源网| 免费看黄色aaaaaa 片| 久久亚洲欧美国产精品乐播| 人妻体内射精一区二区| 久久精品亚洲乱码伦伦中文 | 精品久久久亚洲| 日韩国产欧美一区| 亚洲色图国产| 国产精品成人久久电影| 在线视频日韩| 在线免费观看视频黄| 国产一区美女在线| 精品1卡二卡三卡四卡老狼| 91偷拍与自偷拍精品| 午夜时刻免费入口| 亚洲欧洲国产日韩| 久久99久久久| 色婷婷久久久久swag精品| 中国a一片一级一片| 日韩一区二区三| 香蕉人妻av久久久久天天| 亚洲午夜精品久久久久久性色| 日本在线天堂| 欧美激情乱人伦| 欧美色片在线观看| 91久久精品www人人做人人爽| 精品av导航| 亚洲国产精品久久久久久女王| 午夜精品久久99蜜桃的功能介绍| 免费国产a级片| 美女视频一区在线观看| 久久久久无码国产精品一区李宗瑞| 91免费观看在线| 午夜国产福利一区二区| 精品二区三区线观看| 91尤物国产福利在线观看| 亚洲国产天堂网精品网站| 1pondo在线播放免费| 国内久久久精品| 四虎国产精品成人免费影视| 精品久久蜜桃| 亚洲mv大片欧洲mv大片| 日本毛片在线免费观看| 国产一区二区三区免费播放| 中文字幕一区二区人妻在线不卡| 亚洲三级在线观看| 中文字幕日韩免费| 精品国产一区二区三区久久久蜜月 | 久热99视频在线观看| 中文字幕在线高清| 亚洲一区二区三区777| 不卡一区综合视频| 欧美不卡在线播放| 国产精品1区2区| 国精产品视频一二二区| 日韩欧美精品在线观看| 免费观看黄色av| 久久不射电影网| 国产亚洲精彩久久| 蜜桃狠狠色伊人亚洲综合网站| 欧美日韩1区| 天堂一区在线观看| 久久蜜桃一区二区| 精品国产免费观看| 精品久久久久av影院| 老司机在线看片网av| 日本精品一区二区三区在线| 成人爽a毛片| 亚洲精品天堂成人片av在线播放 | 国产精品一区二区三区毛片淫片| 欧美挤奶吃奶水xxxxx| 日韩久久久久久久久久久久| 国内成人精品2018免费看| 在线免费观看视频| 一本色道久久综合亚洲aⅴ蜜桃 | av黄色在线网站| 成人精品视频一区二区三区| 麻豆亚洲av熟女国产一区二 | 国产精品一香蕉国产线看观看| 色狠狠久久av综合| 欧美 日韩 亚洲 一区| 成人午夜在线播放| 久艹视频在线观看| 日韩美一区二区三区| 日韩专区av| 不卡一卡2卡3卡4卡精品在| 一区二区三区四区日韩| 黄色aaaaaa| 亚洲免费观看高清完整版在线观看| 一本色道久久综合熟妇| 久久国内精品一国内精品| 成人在线视频www| 亚洲精品少妇一区二区| 国产成人亚洲精品青草天美| 免费一级肉体全黄毛片 | 九色视频成人自拍| 日韩免费在线播放| 欧美美女视频| 欧美性受xxxxxx黑人xyx性爽| 中文字幕在线播放不卡一区| 国产乱人乱偷精品视频| 欧美精品在线免费观看| 大桥未久女教师av一区二区| 国产www免费| 99久久国产综合精品色伊| 天天干天天干天天干天天| 国产一区二区三区日韩欧美| 免费视频成人| 精品一区二区三区毛片| 成人午夜视频免费看| 日本va欧美va国产激情| 国产亚洲激情视频在线| 国产精品视频一区二区三区综合| 18黄暴禁片在线观看| www国产精品av| 在线观看中文字幕网站| 欧美大片va欧美在线播放| 亚洲宅男网av| 看看黄色一级片| 亚洲第一久久影院| 美国成人毛片| 91探花福利精品国产自产在线| 欧美久色视频| 熟女丰满老熟女熟妇| 欧美日韩久久久一区| 久草在线资源站资源站| 欧美日韩成人一区二区三区| 狠狠色综合日日| 日韩在线观看第一页| 色视频www在线播放国产成人| 超碰97成人| www.日日操| 亚洲一区二区影院| 黄色美女网站在线观看| 99久久精品久久久久久ai换脸| 国产亚洲精品v| 国产精品99久久久久久成人| 亚洲激情中文字幕| 国产精品一站二站| 亚洲成熟丰满熟妇高潮xxxxx| 亚洲免费看黄网站| 岛国在线大片| 精品视频免费观看|