首页 > 其他 > 详细

删除二叉查找树的节点

时间:2015-09-01 12:38:12      阅读:263      评论:0      收藏:0      [点我收藏+]

        想对于二叉查找树的查找、插入等操作来说,二叉查找树的删除操作是比较复杂的。在具体的分析中可以根据待删除节点的:1、左右子树均为空;2、左右子树中有一个为空;3、左右子树均非空的情况来考虑。

       其中第3种情况即左右子树均非空的情况较为复杂,删除过程中可以找待删除节点的后继节点,与待删除节点交换,然后把后继节点的右子树接入到待删除节点的父节点即可。

  
    TreeNode* removeNode(TreeNode* root, int value) {
        // write your code here
        if(root == nullptr)
            return root;
        
        TreeNode *p, *q;
        p = root;
        q = root;
//p 指向待删除的节点,q 指向待删除节点的父节点        
        while(p){
            if(value == p -> val){
                break;
            }else if(value < p -> val){
                q = p;
                p = p -> left;
            }else{
                q = p;
                p = p -> right;
            }
        }
        
        if(p == nullptr)
            return root;
        
//p 是叶子节点        
        if(p -> left == nullptr && p -> right == nullptr){
            if(p == q){
                return nullptr;
            }else{
                if(q -> left == p){
                    q -> left = nullptr;
                }else{
                    q -> right = nullptr;
                }    
                return root;
            }
        }
        
//p 左右子树中有一个为空        
        if(p -> left == nullptr || p -> right == nullptr){
            if(p -> left == nullptr){
                if(p == q){
                    return q -> right;
                }else{
                    if(q -> left == p){
                        q -> left = p -> right;
                    }else{
                        q -> right = p -> right;
                    }
                    
                }
            }else{
                if(p == q){
                    return q -> left;
                }else{
                    if(q -> left == p){
                        q -> left = p -> left;
                    }else{
                        q -> right = p -> left;
                    }
                }
            }
            return root;
        }
        
//p 的左右子树均非空
        if(p -> left != nullptr && p -> right != nullptr){
            TreeNode *fir = p -> right;
            TreeNode *sec = p;
            while(fir -> left != nullptr){
                sec = fir;
                fir = fir -> left;
            }
            
            p -> val = fir -> val;
            if(p == sec){
                p -> right = fir -> right;
            }else{
                sec -> left = fir -> right;
            }
        }
        
        return root;
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

删除二叉查找树的节点

原文:http://blog.csdn.net/ny_mg/article/details/48155259

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!