精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

免费xxxx性欧美18vr| 91精品久久| 久久久久久久欧美精品| 中文字幕日韩欧美在线| 深夜做爰性大片蜜桃| av成人 com a| 国产精品视频一二三区| 91精品国产一区二区三区动漫 | 精品一区二区三| 8v天堂国产在线一区二区| 鲁一鲁一鲁一鲁一色| 男人和女人做事情在线视频网站免费观看| 国产成人免费视频网站| 国产精品露脸av在线| 国产亚洲第一页| 久久亚洲国产| 亚洲美女视频网站| 中文字幕第六页| 成人国产一区二区三区精品麻豆| 天天色综合久久| 亚洲在线视频| 欧美大片欧美激情性色a∨久久| caopeng视频| 爱爱精品视频| 91精品国产手机| 亚洲综合在线网站| 天堂av在线| 亚洲一区中文日韩| 中文字幕久久综合| aaa在线观看| 国产乱码在线观看| 婷婷久久免费视频| 91九色02白丝porn| 日韩中文字幕三区| 2001个疯子在线观看| 亚洲女与黑人做爰| 中文字幕精品—区二区日日骚| 成人午夜影视| 国产日韩欧美精品一区| 久久精品欧美| 天堂中文网在线| 成人综合激情网| 91在线在线观看| 精品人妻伦一二三区久久| 麻豆国产一区二区| 国产男人精品视频| 一级全黄少妇性色生活片| 免费观看日韩av| 国产精品久久久久久久久免费看 | 欧美中文字幕| 欧美在线视频一区二区| 特黄视频免费看| 先锋影音久久久| 日韩69视频在线观看| 亚洲欧美一区二区三区在线观看 | 自拍视频在线网| 国产高清无密码一区二区三区| 成人精品在线视频| 国产视频一区二区三| 国产一区二区不卡在线| 亚洲一区美女视频在线观看免费| aaa一区二区三区| 成人午夜在线播放| 国产一区二区三区免费不卡| 亚洲视频精品一区| 在线免费看a| 综合在线观看色| 久久久久福利视频| www欧美xxxx| 亚洲狼人综合| 日韩一级大片在线观看| 日本精品一二三| 免费看久久久| 亚洲人高潮女人毛茸茸| 国产噜噜噜噜久久久久久久久| 免费视频网站在线观看入口| 免费在线成人网| 91精品在线国产| 亚洲欧美黄色片| jizz久久久久久| 91精品福利视频| 亚洲美女爱爱视频| 成功精品影院| 亚洲视频第一页| 97精品在线播放| 日韩香蕉视频| 一区二区三区四区亚洲| 亚洲第一综合网站| www欧美xxxx| 欧美亚洲愉拍一区二区| 黄色片免费网址| 日韩欧美在线精品| 日韩精品国产欧美| 91精品视频网站| 天堂中文在线资源| 国产精品丝袜一区| 阿v天堂2018| 精品网站在线| 精品国产一区二区三区四区四| 天堂久久精品忘忧草| 欧美全黄视频| 国产精品久久久久一区二区| 亚洲va久久久噜噜噜无码久久| 国产亚洲欧美在线| 欧美激情亚洲天堂| 在线成人视屏| 亚洲精品国产精品自产a区红杏吧| 少妇愉情理伦三级| 亚洲高清成人| 成人在线精品视频| 欧美3p视频在线观看| 亚洲综合一区二区三区| 国产三级三级看三级| 国产精品99久久免费观看| zzjj国产精品一区二区| 国产又爽又黄的视频| 国产福利精品导航| 在线观看免费91| 日韩a**中文字幕| 亚洲国产日韩欧美在线图片 | 欧美另类自拍| 亚洲国产精品视频| 亚洲男人天堂2021| 欧美精品国产白浆久久久久| 久久69精品久久久久久久电影好 | 中国女人做爰视频| 日韩国产一二三区| 在线看欧美日韩| 国产精品视频一区在线观看| www.亚洲激情.com| 久久久天堂国产精品| 国产精品日韩精品在线播放| 日韩在线小视频| 国产男人搡女人免费视频| 99免费精品视频| av在线观看地址| 亚洲视频国产| 久久99精品久久久久久青青91| 国产精品久久久久久69| 中文字幕中文乱码欧美一区二区 | 亚洲精品tv| 日韩在线视频国产| 亚洲综合网av| 最新国产精品久久精品| 亚洲一区二区蜜桃| 欧美自拍偷拍| 国产日韩欧美视频| 午夜在线小视频| 欧美三区在线视频| 国产在视频线精品视频| 狠狠色综合播放一区二区| 亚洲国产精品一区二区第四页av| 国产成人精品123区免费视频| 国产亚洲欧洲黄色| 中文字幕在线观看国产| 亚洲人成精品久久久久久| 1314成人网| 尤物在线精品| 久久99精品国产99久久| 亚洲高清黄色| 日韩在线小视频| 亚洲毛片在线播放| 精品久久久久久中文字幕一区奶水| 大乳护士喂奶hd| 久久精品女人| 中文字幕一区二区三区有限公司| 日韩在线成人| 欧美一级大片视频| av网站在线免费播放| 69久久99精品久久久久婷婷| 黄色一级视频免费| 26uuu久久天堂性欧美| 韩国中文字幕av| 中文字幕午夜精品一区二区三区| 国产精品大全| 国产91亚洲精品久久久| 欧美成人激情在线| 神马久久久久| 欧美精品亚洲二区| 日本三级2019| 国产精品乱人伦中文| 国产精品91av| 日本最新不卡在线| 欧美在线观看视频免费| 天天躁日日躁狠狠躁欧美巨大小说 | 一级黄色毛毛片| 国产成人亚洲综合a∨婷婷| 免费黄色日本网站| 亚洲成av人电影| 久久久久九九九| 亚洲老司机网| 日本中文字幕久久看| 亚洲大胆人体大胆做受1| 亚洲精品综合久久中文字幕| 国产精选久久久| 欧美日韩国产在线看| 乱老熟女一区二区三区| 99re视频精品| 五月天六月丁香| 久久中文字幕一区二区三区| 免费极品av一视觉盛宴| 成人高清电影网站| 精品视频一区在线| 亚洲精品国产九九九| 国产精品99一区| av资源新版天堂在线| 日日狠狠久久偷偷四色综合免费 | 国产 欧美 精品| 欧美日韩国产美女| 青青草免费观看视频| 一区二区三区在线免费| 一本色道久久88| 久久免费看少妇高潮| 99久久久无码国产精品性波多| 麻豆国产欧美一区二区三区| 少妇人妻互换不带套| 亚洲一区日韩| 人妻av中文系列| 国产精品a级| 天天做天天爱天天高潮| 禁断一区二区三区在线| 国产精品一区二区在线观看| 美女日韩一区| 91色精品视频在线| 激情小说亚洲| 国产精品露脸av在线| 欧美大片1688| 清纯唯美日韩制服另类| 波多野结依一区| 欧美国产精品人人做人人爱| 福利视频在线| 久久久国产视频91| 欧美性猛交xxx乱大交3蜜桃| 一区二区三区亚洲| 国产精品久久久久一区二区国产| 亚洲免费一级电影| 天堂中文在线资| 国产午夜精品理论片a级探花| 天天操天天操天天干| 亚洲国产成人在线播放| 国产1区在线观看| 欧美精品一区二区精品网| 亚洲a视频在线观看| 亚洲成人1234| 日本在线丨区| 亚洲图片在区色| 啊v在线视频| 日韩在线观看精品| 九色porny丨首页在线| 麻豆成人在线看| 影音先锋男人资源在线| 国内精品久久久久久久| caoporn视频在线观看| 2019中文字幕免费视频| 亚洲国产福利| 国产精品视频久久久久| 亚洲精品aa| 动漫一区二区在线| 欧美日韩大片免费观看| 欧美高清性xxxxhdvideosex| 精品国产成人| 一区二区三区欧美成人| 欧美激情1区| 男女猛烈激情xx00免费视频| 久久精品九九| 亚洲女人在线观看| gogogo免费视频观看亚洲一| 中文字幕国产综合| 国产精品美女久久久久av爽李琼| 中文字幕在线有码| 亚洲va欧美va人人爽午夜| 日本中文字幕久久| 69p69国产精品| 天堂成人在线视频| 这里只有视频精品| 在线观看免费视频你懂的| 668精品在线视频| 成人免费一区| 国产精品对白一区二区三区| 欧美人与牛zoz0性行为| 综合久久国产| 国产一区二区你懂的| 亚洲美女爱爱视频| 99久久777色| 91视频最新网址| 午夜电影久久久| 一级黄色短视频| 精品99999| 婷婷视频在线| 国产91精品视频在线观看| 亚洲精品66| 欧美日韩免费高清| 欧美激情视频一区二区三区免费| 97公开免费视频| 国产成人av影院| 纪美影视在线观看电视版使用方法| 亚洲精品国产成人久久av盗摄| 丰满人妻老熟妇伦人精品| 日韩小视频在线观看专区| 国产黄在线观看| 韩国欧美亚洲国产| 粉嫩一区二区三区在线观看| 久久久久久久久久久久久久一区 | 九九热视频这里只有精品| 欧美成人资源| 国产精品久久国产精品| 99精品美女| 污污视频网站免费观看| 99久久久久久99| 动漫性做爰视频| 色综合天天综合| 高h震动喷水双性1v1| 久久综合免费视频影院| 日韩视频网站在线观看| 久中文字幕一区| 亚洲视频中文| 久久人人爽人人片| 中文字幕av一区 二区| 在线视频一区二区三区四区| 亚洲精品久久久久久久久久久久 | 天天超碰亚洲| 美女网站免费观看视频| 91丨国产丨九色丨pron| 精品无码人妻一区二区三| 91麻豆精品国产无毒不卡在线观看 | 美女久久久久久久久久久| 日韩美香港a一级毛片| 色一情一乱一伦一区二区三欧美 | 亚洲美女91| 亚洲无人区码一码二码三码| 一区av在线播放| 国产浮力第一页| 久热精品视频在线观看一区| 57pao成人永久免费| 一区二区精品视频| 美女看a上一区| 色偷偷男人天堂| 欧美日本一区二区| 免费a级毛片在线播放| 国产精品亚发布| 国产精品99久久| 99re6在线观看| 亚洲欧美国产77777| 99在线观看免费| 欧美丰满少妇xxxxx做受| 在线视频亚洲欧美中文| 久久久久久av无码免费网站下载| 国产自产高清不卡| 免费中文字幕在线| 精品嫩草影院久久| 草草在线观看| 久久久久久国产精品mv| 视频一区欧美精品| 女人十八毛片嫩草av| 欧美美女直播网站| 1区2区3区在线视频| 国产精品伊人日日| 国产日韩一区| 免费看91的网站| 正在播放亚洲一区| 免费网站在线观看人| 国产亚洲第一区| 日韩二区三区在线观看| 911国产在线| 日韩一区二区不卡| 欧美激情护士| 午夜精品短视频| 国产精品一区二区黑丝| 97免费在线观看视频| 国产亚洲日本欧美韩国| 国产精品国产亚洲精品| 国产av国片精品| 国产欧美日韩三区| 午夜精品无码一区二区三区| 欧美在线观看网址综合| 日本一区二区高清不卡| 久草福利在线观看| 欧美性猛交xxxx乱大交极品| 午夜在线视频| 九九九九精品| 精一区二区三区| 久久久久久久久久免费视频| 色七七影院综合| 丁香五月缴情综合网| 日韩av片网站| 亚洲一区二区三区四区在线观看 | 91久久久久久久久| 99热精品在线| 欧美激情精品久久久久久免费| 亚洲电影在线观看| 成人精品动漫| 免费黄色日本网站| 亚洲美腿欧美偷拍| 国产免费av在线| 国产经品一区二区| 看电视剧不卡顿的网站| 91av在线免费视频| 欧美xxxx18国产| 欧美精品系列| 荫蒂被男人添免费视频|