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

Java編程內功-數據結構與算法「二叉排序樹」

開發 后端 算法
本篇繼續給大家介紹關于Java編程的相關知識,今天主要介紹關于二叉排序樹的相關內容。

[[390181]]

基本介紹

二叉排序樹:BST(Binary Sort(Search) Tree),對于二叉排序樹的任何一個非葉子節點,要求左節點的值,比當前節點的值小,右節點的值比當前節點的值大。

**特別說明:**如果有相同的值,可以將該節點放在左子節點或者右子節點

比如針對數據{7,3,10,12,5,1,9},對應的二叉排序樹為:

二叉排序樹刪除節點

二叉排序樹的刪除情況比較復雜,如下圖,有下面三種情況需要考慮,

1.刪除葉子節點(比如:2,5,9,12)

  1. 需要先找到要刪除的節點 targetNode
  2. 找到 targetNode 的父節點 parentNode(考慮是否存在父節點)
  3. 確定 targetNode 是 parentNode 的左子節點還是右子節點
  4. 根據前面的來對應刪除,左子節點=>parent.left = null,右子節點=>parent.right = null;

2.刪除只有一顆子樹的節點(比如:1)

  1. 需要先找到要刪除的節點 targetNode
  2. 找到 targetNode 的父節點 parentNode(考慮是否存在父節點)
  3. 確定 targetNode 的子節點是左子節點還是右子節點
  4. 確定 targetNode 是 parentNode 的左子節點還是右子節點
  5. 如果 targetNode 是parentNode 的左子節點 :
  • targetNode 的子節點是左子節點 ,那么 parentNode.left = targetNode.lefttargetNode 的子節點是右子節點,那么, parentNode.left = targetNode.right;
  • 如果 targetNode 是 parentNode 的右子節點:targetNode 的子節點是左子節點 ,那么 parentNode.right = targetNode.lefttargetNode 的子節點是右子節點,那么, parentNode.right = targetNode.right

3.刪除有兩顆子樹的節點(比如:7,3,10)

  1. 需要先找到要刪除的節點 targetNode
  2. 找到 targetNode 的父節點 parentNode(考慮是否存在父節點)
  3. 從 targetNode 的右子樹找到最小的節點,用一個臨時變量,將右子樹最小節點的值保存到temp ,刪除該右子樹最小節點,然后,targetNode.value = temp;如果從左子樹找的話,只要替換左子樹最大的值就行。

代碼案例:

  1. package com.xie.bst; 
  2.  
  3. public class BinarySortTreeDemo { 
  4.     public static void main(String[] args) { 
  5.         int[] arr = {7, 3, 10, 12, 5, 1, 9, 2}; 
  6.         BinarySortTree binarySortTree = new BinarySortTree(); 
  7.         for (int i : arr) { 
  8.             binarySortTree.add(new Node(i)); 
  9.         } 
  10.         System.out.println("中序遍歷二叉排序樹~"); 
  11.         binarySortTree.infixOrder(); 
  12.  
  13.         System.out.println("測試刪除葉子節點"); 
  14.         binarySortTree.delNode(10); 
  15.         System.out.println("刪除節點后"); 
  16.         binarySortTree.infixOrder(); 
  17.     } 
  18.  
  19. class BinarySortTree { 
  20.     private Node root; 
  21.  
  22.     //查找要刪除的節點的父節點 
  23.     public Node searchParent(Node node) { 
  24.         if (root != null) { 
  25.             return root.searchParent(node); 
  26.         } else { 
  27.             return null
  28.         } 
  29.     } 
  30.  
  31.     //查找要刪除的節點 
  32.     public Node search(int value) { 
  33.         if (root == null) { 
  34.             return null
  35.         } else { 
  36.             return root.search(value); 
  37.         } 
  38.     } 
  39.  
  40.     /** 
  41.      * 找到以node 根的二叉排序樹的最小值,并刪除以node 為根節點的二叉排序樹的最小節點 
  42.      * 
  43.      * @param node 傳入節點(當做二叉排序樹的根節點) 
  44.      * @return 返回以node為根節點的二叉排序樹的最小節點值 
  45.      */ 
  46.     public int delRightTreeMin(Node node) { 
  47.         Node target = node; 
  48.         //循環查找左節點 
  49.         while (target.left != null) { 
  50.             target = target.left
  51.         } 
  52.         //刪除最小節點 
  53.         delNode(target.value); 
  54.         return target.value; 
  55.     } 
  56.  
  57.     /** 
  58.      * 找到以node 根的二叉排序樹的最大值,并刪除以node 為根節點的二叉排序樹的最大節點 
  59.      * 
  60.      * @param node 傳入節點(當做二叉排序樹的根節點) 
  61.      * @return 返回以node為根節點的二叉排序樹的最大節點值 
  62.      */ 
  63.     public int delLeftTreeMax(Node node) { 
  64.         Node target = node; 
  65.         while (target.right != null) { 
  66.             target = target.right
  67.         } 
  68.  
  69.         //刪除最大節點 
  70.         delNode(target.value); 
  71.         return target.value; 
  72.     } 
  73.  
  74.     //刪除節點 
  75.     public void delNode(int value) { 
  76.         if (root == null) { 
  77.             return
  78.         } else { 
  79.             Node targetNode = search(value); 
  80.             if (targetNode == null) { 
  81.                 return
  82.             } 
  83.             if (targetNode == root) { 
  84.                 root = null
  85.                 return
  86.             } 
  87.             Node parentNode = searchParent(targetNode); 
  88.  
  89.             if (targetNode.left == null && targetNode.right == null) { 
  90.                 //如果要刪除的節點是葉子節點 
  91.                 if (parentNode.left != null && parentNode.left.value == targetNode.value) { 
  92.                     parentNode.left = null
  93.                 } 
  94.                 if (parentNode.right != null && parentNode.right.value == targetNode.value) { 
  95.                     parentNode.right = null
  96.                 } 
  97.             } else if (targetNode.left != null && targetNode.right != null) { 
  98.                 //如果要刪除的節點是有兩個子樹的節點 
  99.                 int minValue = delRightTreeMin(targetNode.right); 
  100.                 targetNode.value = minValue; 
  101.                 //上下代碼刪除效果一樣 
  102.                 //int maxValue = delLeftTreeMax(targetNode.left); 
  103.                 //targetNode.value = maxValue; 
  104.             } else { 
  105.                 //要刪除的節點是只有左子節點 
  106.                 if (targetNode.left != null) { 
  107.                     if (parentNode != null) { 
  108.                         if (parentNode.left == targetNode) { 
  109.                             parentNode.left = targetNode.left
  110.                         } else { 
  111.                             parentNode.right = targetNode.left
  112.                         } 
  113.                     } else { 
  114.                         //如果父節點是空,讓root換位 
  115.                         root = targetNode.left
  116.                     } 
  117.                 } else {//要刪除的節點是只有右子節點 
  118.                     if (parentNode != null) { 
  119.                         if (parentNode.left == targetNode) { 
  120.                             parentNode.left = targetNode.right
  121.                         } else { 
  122.                             parentNode.right = targetNode.right
  123.                         } 
  124.                     } else { 
  125.                         //如果父節點是空,讓root換位 
  126.                         root = targetNode.right
  127.                     } 
  128.  
  129.                 } 
  130.             } 
  131.         } 
  132.     } 
  133.  
  134.     //添加節點 
  135.     public void add(Node node) { 
  136.         if (root == null) { 
  137.             root = node; 
  138.         } else { 
  139.             root.add(node); 
  140.         } 
  141.     } 
  142.  
  143.     //中序遍歷 
  144.     public void infixOrder() { 
  145.         if (root != null) { 
  146.             root.infixOrder(); 
  147.         } else { 
  148.             System.out.println("二叉排序為空,不能遍歷"); 
  149.         } 
  150.     } 
  151.  
  152.  
  153. class Node { 
  154.     int value; 
  155.     Node left
  156.     Node right
  157.  
  158.     public Node(int value) { 
  159.         this.value = value; 
  160.     } 
  161.  
  162.     /** 
  163.      * 查找要刪除節點的父節點 
  164.      * 
  165.      * @param node 要刪除的節點 
  166.      * @return 要刪除節點的父節點 
  167.      */ 
  168.     public Node searchParent(Node node) { 
  169.         //如果當前節點就是要刪除節點的父節點就返回 
  170.         if ((this.left != null && this.left.value == node.value) || 
  171.                 (this.right != null && this.right.value == node.value)) { 
  172.             return this; 
  173.         } else { 
  174.             if (this.left != null && node.value < this.value) { 
  175.                 //如果查找的節點的值小于當前節點的值,向左子樹遞歸查找 
  176.                 return this.left.searchParent(node); 
  177.             } else if (this.right != null && value >= this.value) { 
  178.                 //如果查找的節點的值小于當前節點的值,向左子樹遞歸查找 
  179.                 return this.right.searchParent(node); 
  180.             } else { 
  181.                 return null
  182.             } 
  183.         } 
  184.     } 
  185.  
  186.     /** 
  187.      * 查找要刪除的節點 
  188.      * 
  189.      * @param value 要刪除的節點的值 
  190.      * @return 刪除的節點 
  191.      */ 
  192.     public Node search(int value) { 
  193.         if (value == this.value) { 
  194.             return this; 
  195.         } else if (value < this.value) { 
  196.             if (this.left != null) { 
  197.                 return this.left.search(value); 
  198.             } else { 
  199.                 return null
  200.             } 
  201.         } else { 
  202.             if (this.right != null) { 
  203.                 return this.right.search(value); 
  204.             } else { 
  205.                 return null
  206.             } 
  207.         } 
  208.     } 
  209.  
  210.     //遞歸的形式添加節點,滿足二叉排序樹的要求 
  211.     public void add(Node node) { 
  212.         if (node == null) { 
  213.             return
  214.         } 
  215.         if (node.value < this.value) { 
  216.             if (this.left == null) { 
  217.                 this.left = node; 
  218.             } else { 
  219.                 //遞歸向左子樹添加 
  220.                 this.left.add(node); 
  221.             } 
  222.         } else { 
  223.             if (this.right == null) { 
  224.                 this.right = node; 
  225.             } else { 
  226.                 //遞歸向右子節點添加 
  227.                 this.right.add(node); 
  228.             } 
  229.         } 
  230.     } 
  231.  
  232.     //中序遍歷 
  233.     public void infixOrder() { 
  234.         if (this.left != null) { 
  235.             this.left.infixOrder(); 
  236.         } 
  237.         System.out.println(this); 
  238.         if (this.right != null) { 
  239.             this.right.infixOrder(); 
  240.         } 
  241.     } 
  242.  
  243.     @Override 
  244.     public String toString() { 
  245.         return "Node{" + 
  246.                 "value=" + value + 
  247.                 '}'
  248.     } 

 【編輯推薦】

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-03-19 10:25:12

Java數據結構算法

2021-04-01 10:34:18

Java編程數據結構算法

2021-03-22 09:00:22

Java數據結構算法

2021-03-18 08:44:20

Java數據結構算法

2021-03-23 08:33:22

Java數據結構算法

2021-04-22 10:07:45

Java數據結構算法

2021-04-07 09:26:37

Java數據結構算法

2021-04-16 09:40:52

Java數據結構算法

2021-04-15 09:36:44

Java數據結構算法

2020-11-02 09:15:47

算法與數據結構

2021-03-24 10:41:04

Java數據結構算法

2021-03-09 06:30:32

JAVA數據結構算法

2021-04-13 09:37:41

Java數據結構算法

2021-05-12 09:07:09

Java數據結構算法

2021-04-23 09:12:09

Java數據結構算法

2020-09-23 18:25:40

算法二叉樹多叉樹

2023-04-06 07:39:48

2021-03-10 08:42:19

Java數據結構算法

2021-03-17 09:27:36

Java數據結構算法

2021-03-08 06:28:57

JAVA數據結構與算法稀疏數組
點贊
收藏

51CTO技術棧公眾號

亚洲高清电影| 久久女人天堂| 久久精品一区二区| 国产美女精彩久久| 久久久久久久久久91| 第四色中文综合网| 在线观看日韩国产| 水蜜桃在线免费观看| 色丁香婷婷综合久久| 久久精品免费| 久久久国产精品亚洲一区| 一区二区免费在线观看视频| 亚洲国产尤物| 亚洲成精国产精品女| 亚洲乱码一区二区三区三上悠亚| 亚洲AV无码一区二区三区性| 丝袜a∨在线一区二区三区不卡| 久久久99免费视频| 国产传媒第一页| 国产欧美视频在线| 一本高清dvd不卡在线观看| 国产欧美综合一区| 久草福利在线视频| 高清国产一区二区三区| 国产精品视频资源| 亚洲欧美偷拍视频| 亚洲视频高清| 久久综合电影一区| 成人国产精品久久久网站| av综合网址| 4438x成人网最大色成网站| 欧美日韩一区二区在线免费观看| 久久av色综合| 亚洲视频一二区| 亚洲国产一区二区三区在线播| 午夜影院免费体验区| 国产伦精品一区二区三区视频青涩 | 免费黄色电影在线观看| 国产视频911| 九九久久99| 好吊色一区二区三区| 经典一区二区三区| 国产精品久久久久久久久久ktv| 91在线看视频| 激情久久久久久久| 欧美国产亚洲精品久久久8v| 色偷偷www8888| 日韩精品永久网址| 在线精品国产欧美| 久久精品一区二区免费播放| 日韩成人av在线资源| 欧美精品一区男女天堂| 欧美日韩国产高清一区二区三区| 亚洲一区二区少妇| 国产日韩免费视频| 国产一区二区三区美女| 成人免费福利视频| 国产毛片毛片毛片毛片毛片| 麻豆精品视频在线观看| 国产精品视频最多的网站| 最近中文字幕av| 免费成人在线视频观看| 国产精品视频在线观看| 亚洲自拍偷拍另类| 精品亚洲国产成人av制服丝袜 | 午夜在线视频免费观看| 91美女视频在线| 中国色在线观看另类| 深夜福利成人| 在线观看免费黄视频| 一区二区中文视频| 中国老女人av| 91九色porn在线资源| 欧美日韩精品在线视频| 任你操这里只有精品| 黄色精品视频| 欧美老人xxxx18| 337p日本欧洲亚洲大胆张筱雨 | 无码小电影在线观看网站免费| 黄色成人av网| 久草综合在线观看| 色综合.com| 欧美mv日韩mv亚洲| 亚洲精品乱码久久久久久久| 国内精品久久久久久久久电影网 | 日本色综合中文字幕| 国产美女被下药99| 亚洲av色香蕉一区二区三区| 99精品视频免费在线观看| 欧美综合77777色婷婷| av基地在线| 亚洲线精品一区二区三区| 亚洲精品蜜桃久久久久久| 欧美大胆成人| 日韩一区二区三区免费看 | 亚洲欧美日韩精品久久久久| 国产freexxxx性播放麻豆| 伊人久久精品一区二区三区| 欧美久久婷婷综合色| 理论片大全免费理伦片| 精品国产a一区二区三区v免费| 精品国产一区二区三区久久| 国产稀缺真实呦乱在线| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精品福利资源站| 国产精品日日摸夜夜添夜夜av| 亚洲中文字幕一区二区| jlzzjlzz亚洲日本少妇| 亚洲精品中文综合第一页| gogo久久| 欧美日韩精品是欧美日韩精品| 午夜福利三级理论电影| 欧美r级电影| 2019中文在线观看| 国内精品久久久久久久久久久| 久久久久高清精品| 国产精品无码免费专区午夜| 国产亚洲一区二区手机在线观看 | 国产视频三级在线观看播放| 亚洲精品免费视频| 在线观看的毛片| 欧美激情极品| 欧美日韩xxxxx| 国产精品高潮呻吟久久久| 久久久精品免费免费| 97在线国产视频| 亚洲伊人精品酒店| 中文一区二区视频| www.久久精品视频| av中文字幕亚洲| 波多野结衣av一区二区全免费观看| 国产美女久久| 夜夜嗨av色一区二区不卡| 日韩av电影网| 丁香婷婷综合五月| 水蜜桃在线免费观看| 黄页免费欧美| 这里只有精品视频| 国产又粗又猛又爽又| 久久综合久久久久88| 国产性生活免费视频| 国产区一区二| 久久成人精品一区二区三区| 97在线视频人妻无码| 亚洲素人一区二区| 国产在线观看中文字幕| 91九色精品国产一区二区| 成人黄色短视频在线观看| 日本综合在线| 欧美剧情片在线观看| 亚洲人做受高潮| 精品一区二区日韩| 久久久久亚洲av无码专区喷水| 国产精品欧美一区二区三区不卡| 超碰97人人做人人爱少妇| 国产剧情精品在线| 亚洲精品中文字幕在线观看| 天堂av手机在线| 91精品国产乱码久久久久久| 亚洲一区亚洲二区| 国产黄色大片在线观看| 亚洲韩国欧洲国产日产av| 青青草av在线播放| 久久久久久99精品| 亚洲欧美日韩一级| 我不卡影院28| 高清不卡一区二区三区| 999福利在线视频| 日韩av在线一区二区| 成人午夜视频在线播放| 久久久精品影视| 牛夜精品久久久久久久| 国产高清一区| 97免费高清电视剧观看| caoporn视频在线观看| 亚洲天堂久久av| 国产精品国产三级国产aⅴ| 亚洲综合无码一区二区| 人妻少妇精品视频一区二区三区| 天堂蜜桃一区二区三区| 一区二区视频在线播放| 凹凸成人在线| 国产精品久久久久久久7电影| 精品国产丝袜高跟鞋| 精品国产3级a| 国产精品51麻豆cm传媒| 一区二区三区欧美亚洲| 加勒比一区二区| 国产美女娇喘av呻吟久久| 波多野结衣综合网| 日韩欧美一区二区三区在线视频 | 亚洲综合图片区| 日韩片在线观看| 美女视频一区在线观看| 妞干网在线播放| gogogo高清在线观看一区二区| 亚洲va男人天堂| 天堂а√在线最新版中文在线| 日韩中文字幕视频| 亚洲精品免费在线观看视频| 色视频欧美一区二区三区| 国产又粗又硬又长又爽| 99久久精品99国产精品| 天堂av在线8| 性久久久久久| 国产精品日韩三级| 国产最新精品| 久久精品国产精品国产精品污 | 色豆豆成人网| 欧美国产乱视频| 三区四区在线视频| 日韩激情av在线免费观看| 国产一区二区三区在线观看| 精品久久久久久久久国产字幕 | 亚洲午夜在线视频| 久久久久久久久久97| 久久人人超碰精品| 欧美夫妇交换xxx| 国产中文字幕一区| 美女一区二区三区视频| 99精品热视频只有精品10| 国产四区在线观看| 欧洲杯半决赛直播| 国产精品一区二区在线观看 | 日本动漫理论片在线观看网站 | 日韩亚洲欧美成人一区| 波多野结衣在线电影| 狠狠爱在线视频一区| 国产一级二级毛片| 亚洲女爱视频在线| 黄色片网站在线播放| 国产亚洲综合av| 女~淫辱の触手3d动漫| 99国产精品久| 国产精品久久久久久亚洲色| 国产精品一二三在| 亚洲免费在线播放视频| 卡一卡二国产精品| youjizzxxxx18| 日本91福利区| 91香蕉视频污版| 日韩激情在线观看| 日本男人操女人| 久久中文在线| 成人免费xxxxx在线视频| 午夜亚洲性色福利视频| 欧美色图在线视频| 扒开jk护士狂揉免费| 本田岬高潮一区二区三区| 黑人玩弄人妻一区二区三区| 国产精品亚洲а∨天堂免在线| 在线播放免费视频| 韩国v欧美v日本v亚洲v| 亚洲制服中文字幕| 国产美女在线观看一区| 性生活在线视频| 国产成人av一区二区三区在线观看| 国产精品中文久久久久久| 国产精品一区二区你懂的| 永久av免费在线观看| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日本二区在线观看| 国产亚洲人成网站| 国产又粗又猛又爽又黄av| 国产精品免费免费| 日韩欧美综合视频| 亚洲一区在线观看免费观看电影高清| 麻豆精品一区二区三区视频| 亚洲国产成人porn| 久久国产视频一区| 欧美视频第二页| 国产乱淫a∨片免费视频| 日韩一区和二区| 天天干天天摸天天操| 亚洲香蕉成人av网站在线观看 | 91av在线网站| 欧美精品高清| 91美女片黄在线观| 成人h动漫免费观看网站| 欧美成ee人免费视频| 日韩欧美一区二区三区在线视频| 久久久久福利视频| 国产精品一国产精品k频道56| 日本免费观看网站| 成人性视频免费网站| 亚洲最大成人网站| 亚洲男人的天堂在线aⅴ视频| 69精品久久久| 在线观看欧美黄色| 亚洲精选一区二区三区| 亚洲欧洲一区二区三区在线观看| 欧美激情免费| 81精品国产乱码久久久久久| 日本亚洲欧洲无免费码在线| 国产精品制服诱惑| 日韩不卡一区| 日日碰狠狠添天天爽超碰97| 久久精品国产久精国产| bl动漫在线观看| 亚洲特级片在线| 成人毛片一区二区三区| 日韩久久免费av| av在线电影网| 欧美一级免费视频| 国产精品美女久久久久| 日本午夜精品一区二区三区| 亚洲网站视频| 日韩a一级欧美一级| 久久五月婷婷丁香社区| 久久免费公开视频| 精品视频在线免费看| 天天干天天舔天天射| 美女福利精品视频| 国产一区二区三区影视| 韩日午夜在线资源一区二区| 91精品国产乱码久久久久久| 欧美一级片中文字幕| 岛国av在线一区| 天海翼在线视频| 欧美在线免费播放| 欧美一级做性受免费大片免费| 日韩中文字幕免费看| 另类中文字幕国产精品| 无码av免费一区二区三区试看| 高清欧美精品xxxxx| 日韩av电影天堂| 中文字幕在线观看的网站| 一区二区三区四区不卡视频| 国产又大又黑又粗| 中文字幕精品—区二区| 免费电影日韩网站| 久久精品美女| 亚洲深夜av| 丰满岳乱妇一区二区| 一区二区三区四区亚洲| 国产aⅴ一区二区三区| 精品国产拍在线观看| 日本成人一区二区| 一区二区三区四区视频在线观看| 天堂成人国产精品一区| 在线免费观看麻豆| 欧美性猛交xxxx久久久| 日本福利片高清在线观看| 91禁外国网站| 日韩av黄色在线| www一区二区www免费| 99久久99久久免费精品蜜臀| 日韩欧美一区二区一幕| 亚洲国产精品专区久久| 蜜桃视频www网站在线观看| 久久资源av| 蜜乳av另类精品一区二区| 扒开jk护士狂揉免费| 欧美性做爰猛烈叫床潮| 爱爱爱免费视频在线观看| 国产精品女视频| 国产精品国内免费一区二区三区| 久久国产这里只有精品| 亚洲视频在线观看一区| 亚洲av无码乱码在线观看性色| 欧美精品久久久久久久| 国产精品45p| 国产xxxxx在线观看| 中文字幕第一区综合| 国产精品热久久| 久久久久久亚洲| 窝窝社区一区二区| 美女网站视频黄色| 亚洲欧洲国产专区| 欧美日韩综合网| 欧美色女视频| 在线看免费毛片| 一区二区三区不卡视频在线观看| 六月婷婷综合网| 国产精品va在线播放| 久久成人综合| 无码人妻一区二区三区精品视频 | 亚洲第一精品区| 成人免费视频视频| 中文字幕xxxx| 欧美超级免费视 在线| 黄色欧美网站| 午夜欧美福利视频| 亚洲狠狠丁香婷婷综合久久久| 免费观看黄色av| 国产盗摄xxxx视频xxx69| 婷婷综合社区| 国产传媒第一页| 日韩一区二区不卡| 欧美电影免费观看高清完整| 中国人体摄影一区二区三区| 成人h版在线观看| 中文字幕乱码一区二区 | 一级日韩一区在线观看| 国产**成人网毛片九色| 最近中文字幕在线观看| 午夜精品一区二区三区在线播放| 九九视频免费观看视频精品| 亚洲黄色片免费看| 91国偷自产一区二区开放时间 |