码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树前驱后继概念及删除操作

时间:2018-03-25 11:56:49      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:查找   分享   gps   padding   ++   order   evm   html   func   

二叉树前驱后继概念及删除操作

前驱和后继(中序遍历)

节点的前驱:是该节点的左子树中的最大节点。
节点的后继:是该节点的右子树中的最小节点。

理解图:

技术分享图片

查找前驱节点的代码

/* 
 * 找结点(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

?

二叉树前驱后继概念及删除操作

标签:查找   分享   gps   padding   ++   order   evm   html   func   

原文地址:https://www.cnblogs.com/zhihaowu/p/8643169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!