樹--二叉查找樹(二叉排序樹)

二叉查找樹:web

或者是一棵空樹spa

或者是具備下列性質的二叉樹3d

(1)若左子樹不空,則左子樹上全部結點的值均小於它的根結點的值; 指針

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

3)左、右子樹也分別爲二叉排序樹;htm

 

(1)查找blog

 步驟: 排序

  若根結點的 關鍵字值等於查找的關鍵字,成功。
  不然,若小於根結點的 關鍵字值, 遞歸查左子樹。若大於根結點的 關鍵字值, 遞歸查右子樹。若子樹爲空,查找不成功。
 
(2)插入
  與次優二叉樹相對,二叉排序樹是一種動態樹表。其特色是:樹的結構一般不是一次生成的,而是在查找過程當中,當樹中不存在關鍵字等於給定值的節點時再進行插入。新插入的結點必定是一個新添加的葉子節點而且是查找不成功時查找路徑上訪問的最後一個結點的左孩子或右孩子結點。
  舉例說明:
    想要插入x=5,先進行查找功能,若是找到x,則什麼也不用作。不然,將x插入到遍歷的路徑上的最後一點上。

 

 

  (3)刪除遞歸

    在二叉排序樹刪去一個結點,分三種狀況討論:ci

    1.若*p結點爲葉子結點,即PL(左子樹)和PR(右子樹)均爲空樹。因爲刪去葉子結點不破壞整棵樹的結構,則只需修改其雙親結點的指針便可。

      2.若*p結點只有左子樹PL或右子樹PR,此時只要令PL或PR直接成爲其雙親結點*f的左子樹(當*p是左子樹)或右子樹(當*p是右子樹)便可,做此修改也不破壞二叉排序樹的特性。

      (在下面的二叉查找樹中刪除元素:4)

              

      3.若*p結點的左子樹和右子樹均不空。在刪去*p以後,爲保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,能夠有兩種作法:

          其一是令*p的左子樹爲*f的左/右(依*p是*f的左子樹仍是右子樹而定)子樹,*s爲*p左子樹的最右下的結點,而*p的右子樹爲*s的右子樹;
          其二是令*p的直接前驅(或直接後繼)替代*p,而後再從二叉排序樹中刪去它的直接前驅(或直接後繼)-即讓*f的左子樹(若是有的話)成爲*p左子樹的最左下結點(若是有的話),再讓*f成爲*p的左右結點的父結點。
         (在下面的二叉查找樹中刪除元素:2)

 

                  

相關文章
相關標籤/搜索