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

欧美影视一区二区| 91av在线国产| 日本女人性视频| a国产在线视频| 久久久精品国产免大香伊| 久久久久国产精品www| 亚洲熟女乱综合一区二区| 欧美大胆a人体大胆做受| 中文字幕精品—区二区四季| 91丨九色丨国产| 337p粉嫩色噜噜噜大肥臀| 香蕉视频国产精品| 日韩极品精品视频免费观看| 中文字幕永久有效| 日本在线啊啊| 亚洲日本在线天堂| 久久99久久精品国产| 一级黄色片在线观看| 亚洲国产1区| 搡老女人一区二区三区视频tv| 国产精品91av| 欧美aaaaaaaa| 欧美性猛xxx| 青青草视频国产| 97电影在线看视频| 99riav一区二区三区| 91九色单男在线观看| 秋霞精品一区二区三区| 欧美日韩视频一区二区三区| 中文字幕在线精品| 国内精品久久99人妻无码| 国产综合色激情| 色香蕉久久蜜桃| 丁香六月激情婷婷| 亚洲精品白浆| 国产精品国产三级国产| 日韩欧美亚洲v片| 无码国产精品一区二区免费16 | 国产亚洲综合在线| 国产伦理一区二区三区| 国产女人高潮毛片| 毛片不卡一区二区| 国产精品久久视频| 中文字幕在线看人| 国产亚洲综合精品| 97精品国产97久久久久久| 久久久精品99| 欧美日韩理论| 欧美激情视频网| 久久亚洲成人av| 欧美日韩 国产精品| 久久精品视频网站| 99热这里只有精品4| 色综合天天爱| 精品国产一区二区三区久久狼黑人| 国产精品久久免费观看| 欧美精品一区二区久久| 尤物yw午夜国产精品视频| jizz中文字幕| 91视频综合| 久久久精品中文字幕| 国产男女猛烈无遮挡在线喷水| 日韩激情一区| 久久天天躁日日躁| 欧美成人精品欧美一| 欧美精品入口| 欧美夜福利tv在线| 免费看污视频的网站| 蜜臀精品一区二区三区在线观看| 日韩美女免费视频| 岳乳丰满一区二区三区| 久久精品久久久精品美女| 国产日韩在线看片| www.香蕉视频| 不卡大黄网站免费看| 久久精品二区| 福利小视频在线观看| 国产精品理伦片| 日韩人妻一区二区三区蜜桃视频| 草草影院在线| 一本久久a久久精品亚洲| 亚洲性生活网站| 91麻豆精品| 亚洲成人网在线观看| 中国毛片在线观看| 婷婷综合社区| 91国在线精品国内播放| 久久这里只有精品9| 激情五月激情综合网| 成人91免费视频| 欧洲综合视频| 亚洲人成伊人成综合网小说| 91午夜在线观看| av在线日韩| 欧美一区二区三区四区在线观看| 91丨porny丨对白| 欧美日韩激情| 久久久久久av| 一本一道人人妻人人妻αv | 亚洲第一成人网站| 四虎8848精品成人免费网站| 欧美极品欧美精品欧美视频 | 欧美剧在线免费观看网站| 一级黄色大片免费看| 亚洲专区视频| 久久99精品视频一区97| 中文字幕免费观看| 国产精品一区二区久久不卡| 日本10禁啪啪无遮挡免费一区二区| 欧美人xxx| 狠狠久久五月精品中文字幕| 污网站在线免费| 蜜臀av免费一区二区三区| yw.139尤物在线精品视频| 久久久国产精品成人免费| 国产在线观看免费一区| 欧美一区二区综合| 91豆花视频在线播放| 精品视频123区在线观看| 中文在线一区二区三区| 重囗味另类老妇506070| 国产精品人成电影在线观看| 无码国产伦一区二区三区视频| 1000精品久久久久久久久| 日本www在线播放| 天堂精品在线视频| 精品国偷自产在线视频| 精品免费囯产一区二区三区 | 谁有免费的黄色网址| 影音先锋中文字幕一区二区| 亚洲999一在线观看www| 福利视频在线播放| 色综合久久中文字幕| 中国特级黄色大片| 国精品一区二区| 97免费资源站| 在线观看午夜av| 91麻豆精品国产91久久久| 激情五月深爱五月| 免费在线欧美视频| 性欧美精品一区二区三区在线播放 | 亚洲免费福利一区| 91精品国产免费久久久久久| 国产综合在线播放| 亚洲午夜一区二区| xxxx视频在线观看| 激情视频一区二区三区| 99久久国产免费免费| а天堂中文在线官网| 欧美一区二区三区四区五区| 欧美日韩午夜视频| 美女诱惑一区二区| 中文视频一区视频二区视频三区| 国产一区二区主播在线| 中文字幕自拍vr一区二区三区| 无码人妻一区二区三区线| 久久久久青草大香线综合精品| 日本wwww视频| 欧美最新另类人妖| 国产有码一区二区| 欧美jizzhd69巨大| 欧美一二三四在线| 国产亚洲精品女人久久久久久| 国产精品中文字幕日韩精品| 欧美 日韩 国产精品| 大伊香蕉精品在线品播放| 久久久爽爽爽美女图片| 天堂影院在线| 欧美网站一区二区| 久久免费看少妇高潮v片特黄| 国产乱码一区二区三区| 美女扒开大腿让男人桶| 欧美久久香蕉| 国产精品美女久久| 黄色在线论坛| 欧美精品一区男女天堂| 欧美精品韩国精品| 中文字幕免费观看一区| 国产毛片久久久久久| 国产精品v亚洲精品v日韩精品| 国产高清精品一区二区三区| 一区二区三区电影大全| 最新国产成人av网站网址麻豆| 国产丝袜在线视频| 狠狠久久亚洲欧美专区| www中文在线| www.av亚洲| 欧美精品久久久久久久久25p| 综合激情婷婷| 日本黑人久久| 视频精品国内| 国产精品wwwwww| 日本乱理伦在线| 亚洲图片欧洲图片av| 99久久国产热无码精品免费| 欧美日韩国产页| 美国黄色片视频| 99精品久久只有精品| 欧美午夜aaaaaa免费视频| 亚洲福利电影| 色中文字幕在线观看| 欧美一区二区三区红桃小说| 91久久国产精品| 伊人久久在线| 欧美高清在线观看| 9色在线观看| 国产视频久久久久久久| 国产强伦人妻毛片| 欧美在线观看一二区| 久久影院一区二区| 中文字幕一区二区日韩精品绯色| 中文字幕一二三四区| 丁香一区二区三区| 伊人国产在线视频| 老**午夜毛片一区二区三区 | 日韩三级免费观看| 日本妇乱大交xxxxx| 亚洲成人av一区二区三区| 欧美h片在线观看| 国产日本欧美一区二区| 中文字幕 日本| 国产99久久久国产精品免费看| 污污网站免费看| 欧美资源在线| 免费在线观看亚洲视频| 国内精品美女在线观看| 天堂av免费看| 99视频精品全国免费| 青青成人在线| 免费不卡中文字幕在线| 久久日韩精品| 卡一精品卡二卡三网站乱码| 高清国语自产拍免费一区二区三区| 亚洲欧洲二区| 国产欧美日韩精品专区| 狂野欧美性猛交xxxx| 国产成人短视频| 日韩不卡免费高清视频| 欧美一级电影久久| 麻豆蜜桃在线观看| 国产69久久精品成人看| 黄色污网站在线观看| 国外色69视频在线观看| 爱情岛亚洲播放路线| 国内精品久久久久久久久| 美女日批视频在线观看| 欧美激情a在线| 国产偷倩在线播放| 97精品一区二区三区| 国产黄大片在线观看| 国内精品小视频| 国产传媒在线| 国产99久久久欧美黑人| 2019年精品视频自拍| 国产精品久久久久免费a∨大胸| 日本欧美不卡| 成人高清视频观看www| 国产精品毛片aⅴ一区二区三区| 亚洲综合成人婷婷小说| avtt综合网| 精品久久精品久久| 蜜桃国内精品久久久久软件9| 视频一区视频二区视频三区高| 色小子综合网| 亚洲国产一二三精品无码| 亚洲黄色av| 能看的毛片网站| 国产一区免费电影| 蜜臀视频在线观看| 久久婷婷久久一区二区三区| 国产成人一区二区在线观看| 亚洲人妖av一区二区| 懂色av.com| 在线观看日韩高清av| 国产女人高潮毛片| 日韩电影免费在线观看中文字幕| 久草视频视频在线播放| 精品国产一区久久久| 国产盗摄一区二区| 日韩免费在线免费观看| 亚洲网站三级| 精品欧美国产| 欧美国产一级| 青青青免费在线| 另类小说综合欧美亚洲| 绯色av蜜臀vs少妇| 国产日产亚洲精品系列| 成熟的女同志hd| 欧美性jizz18性欧美| 国产精品久久免费| 日韩av影院在线观看| 九色porny在线| 7m第一福利500精品视频| 日韩三级成人| 欧美日韩精品中文字幕一区二区| 亚洲最新av| 成人在线免费播放视频| 国产不卡在线一区| 欧美巨胸大乳hitomi| 亚洲成a人片在线不卡一二三区| 少妇又紧又色又爽又刺激视频| 精品国产乱码久久久久久免费| 国产大片在线免费观看| 久久久久久成人精品| 日本在线一区二区| 欧美精品亚洲| 亚洲巨乳在线| 亚洲午夜精品在线观看| 欧美国产激情一区二区三区蜜月| 懂色av.com| 日韩亚洲欧美高清| 欧美激情黑人| 国产精品99导航| 99精品国产高清一区二区麻豆| 亚洲高清视频一区二区| 国产精品主播| 完美搭档在线观看| 亚洲黄网站在线观看| 一本一道精品欧美中文字幕| 亚洲日本中文字幕| 国产自产自拍视频在线观看| 亚洲最大福利视频网站| 香蕉视频国产精品| 在线观看日本一区二区| 亚洲国产精品成人综合色在线婷婷| 日韩av一二三区| 日韩欧美国产午夜精品| 成人在线播放免费观看| 国产免费亚洲高清| 日韩国产一区二区| 黑森林精品导航| 日本一区二区在线不卡| av网站中文字幕| 亚洲人线精品午夜| 亚洲精品一区| 欧美福利精品| 久久国产66| 一区二区精品免费| 色婷婷综合久久久中文一区二区 | 97久久精品人人爽人人爽蜜臀| 国产一级一片免费播放放a| 日韩一区二区不卡| 2021国产在线| www久久99| 欧美视频成人| yjizz视频| 精品久久久国产精品999| 亚洲AV第二区国产精品| 91产国在线观看动作片喷水| 日本欧美三级| 久久久精品在线视频| 久久精品一区四区| 国产精品高清无码| 中文字幕亚洲一区二区三区| 亚洲人成网站在线在线观看| 国产四区在线观看| 国产成人午夜99999| 国产对白videos麻豆高潮| 精品国产乱码久久久久久牛牛| 888av在线视频| 欧美日韩国产一二| 日韩1区2区日韩1区2区| 日本黄色录像视频| 精品精品欲导航| 涩涩涩视频在线观看| 亚洲国产一区二区三区在线| 看片的网站亚洲| 激情五月婷婷小说| 亚洲国产精品久久久| 日韩在线免费| 男人天堂成人网| 99r国产精品| 亚洲综合视频在线播放| 欧美精品第一页在线播放| 日韩精品社区| 五月婷婷六月合| 亚洲一二三四在线观看| 男人天堂亚洲二区| 成人黄色片在线| 亚洲精品女人| 999久久久国产| 精品奇米国产一区二区三区| 黄色综合网址| 4444在线观看| 久久亚区不卡日本| 国产又粗又猛又爽又黄91| 国产69精品久久久久99| 不卡中文一二三区| 中国特级黄色片| 欧洲视频一区二区| 黄页在线观看免费| 日本在线播放一区| 成人小视频在线观看| 波多野结衣在线观看视频| 欧美成人亚洲成人日韩成人| 久久成人av| 国产女主播在线播放| 精品视频一区 二区 三区| 三级在线看中文字幕完整版| 这里只有精品66|