1. 程式人生 > >二叉樹前驅後繼概念及刪除操作

二叉樹前驅後繼概念及刪除操作

cnblogs ack 選擇 comment DC auto maximum 最小 back

二叉樹前驅後繼概念及刪除操作

前驅和後繼(中序遍歷)

節點的前驅:是該節點的左子樹中的最大節點。
節點的後繼:是該節點的右子樹中的最小節點。

理解圖:

技術分享圖片

查找前驅節點的代碼

/* 
 * 找結點(x)的前驅結點。即,查找"二叉樹中數據值小於該結點"的"最大結點"。
 */
public BSTNode<T> predecessor(BSTNode<T> x) {
    // 如果x存在左孩子,則"x的前驅結點"為 "以其左孩子為根的子樹的最大結點"。
    if (x.left != null)
        return maximum(x.left);

    // 如果x沒有左孩子。則x有以下兩種可能:
// x是"一個右孩子",則"x的前驅結點"為 "它的父結點"。 // x是"一個左孩子",則查找"x的最低的父結點,並且該父結點要具有右孩子",找到的這個"最低的父結點"就是"x的前驅結點"。 BSTNode<T> y = x.parent; while ((y!=null) && (x==y.left)) { x = y; y = y.parent; } return y; }

查找後繼節點的代碼

/* 
 * 找結點(x)的後繼結點。即,查找"二叉樹中數據值大於該結點"的"最小結點"。
 */
public BSTNode<T> successor(BSTNode<T> x) { // 如果x存在右孩子,則"x的後繼結點"為 "以其右孩子為根的子樹的最小結點"。 if (x.right != null) return minimum(x.right); // 如果x沒有右孩子。則x有以下兩種可能: // x是"一個左孩子",則"x的後繼結點"為 "它的父結點"。 // x是"一個右孩子",則查找"x的最低的父結點,並且該父結點要具有左孩子",找到的這個"最低的父結點"就是"x的後繼結點"。 BSTNode<T> y = x.parent; while
((y!=null) && (x==y.right)) { x = y; y = y.parent; } return y; }

刪除

理解圖:

技術分享圖片

代碼:

private BSTNode<T> remove(BSTree<T> bst, BSTNode<T> z) {
    BSTNode<T> x=null;
    BSTNode<T> y=null;
    /*
    * z: 要刪除的節點
    * y: 要代替z的節點
    * x: y的孩子節點。x需替代y的位置。
    *
    * */
    if ((z.left == null) || (z.right == null) )//只有一個孩子或沒孩子。
        y = z;
    else//兩個孩子,尋找後繼
        y = successor(z);
    //選擇y下需要上調的孩子--x
    if (y.left != null)
        x = y.left;
    else
        x = y.right;
    //x代替y的位置
    if (x != null)
        x.parent = y.parent;

    if (y.parent == null)
        bst.mRoot = x;
    else if (y == y.parent.left)//是左孩子,則x放左邊
        y.parent.left = x;
    else
        y.parent.right = x;

    if (y != z)//如果不是孩子直接替換的情況,要把後繼節點值賦給z
        z.key = y.key;

    return y;
}

引用:

  圖2:https://blog.csdn.net/nzh1234/article/details/31076401

  代碼:http://www.cnblogs.com/skywang12345/p/3576452.html

?

二叉樹前驅後繼概念及刪除操作