二叉查找樹中節點的刪除


  二叉查找樹重要性質:

                                            (1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

                                            (2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

                                            (3)左、右子樹也分別為二叉排序樹;

    現有,如下一棵二叉查找樹。

                             

                                                                      (圖1)

    現在,若要刪除圖1中,任意節點,需要考慮如下三種情況:

    (1)需要刪除的節點下並沒有其他子節點。

    (2)需要刪除的節點下有一個子節點(左或右)。

    (3)需要刪除的節點下有兩個子節點(既左右節點都存在)。

    第一種情況直接刪除即可,下面,直接討論第二種情況。

    若我們要刪除的是3號節點,由圖1可以看到,它下面還有一個4號子節點。由下圖2,可以看出,對於這種辦法,我們只需要想辦法,讓5號節點的左子樹的指針指向4就可以了。

                                        

                                                                       (圖2)

    第三種情況,既我們要刪除的節點下,有2個子節點。如圖3,我們先在需要刪除的節點的右子樹中,找到一個最小的值(因為右子樹中的節點的值一定大於根節點)。然后,用找到的最小的值與需要刪除的節點的值替換。然后,再將最小值的原節點進行刪除(圖4)。

                                          

                                                                          (圖3)

                                           

                                                                             (圖4)

    好了,思路大概就這樣了。下面見代碼。

[java]  view plain  copy
 
  1. private Node<T> remove(T data,Node<T> node)  
  2. {  
  3.     if(data == null)  
  4.         return node;  
  5.     /** 
  6.      * compare函數內部實現大致如下: 
  7.      * ((comparable)data).compareTo(node.element); 
  8.      * 比較需要刪除的數據與當前節點的值的大小 
  9.      */  
  10.     int result = compare(data,node.element);  
  11.     //result<0:表示需要刪除的節點在左子樹。(二叉查找數的性質)  
  12.     if(result<0)  
  13.         node.left = remove(data,node.left);  
  14.     else if(result>0)//在右子樹  
  15.         node.right = remove(data,node.right);  
  16.     else if(node.left != null && node.right != null)//找到需要刪除的節點且節點下有兩個子節點  
  17.     {  
  18.         /**先找到需要刪除的節點下,右子樹中最小的節點 
  19.          * 並將它的值賦給需要刪除的節點。 
  20.          * */  
  21.         node.element = findMin(node.right).element;  
  22.         //刪除前面找到的最小的節點。  
  23.         node.right = remove(node.right);  
  24.     }  
  25.     else//找到需要刪除的節點且節點下有一個子節點(左或者右)  
  26.         node = (node.left != null) ? node.left : node.right;  
  27. }  
  28.   
  29. public void remove(T data)  
  30. {  
  31.     this.remove(data,root);  
  32. }  

    學習筆記。拍磚請輕拍。- -


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM