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

删除二叉查找树的节点

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

标签:c++   二叉树   排序   

        想对于二叉查找树的查找、插入等操作来说,二叉查找树的删除操作是比较复杂的。在具体的分析中可以根据待删除节点的: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;
    }

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

删除二叉查找树的节点

标签:c++   二叉树   排序   

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

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