C++实现二叉搜索树(搜索与删除结点)

二叉排序树(搜索、删除)

  • 二叉排序树,又称二叉查找树、二叉搜索树。
    性质如下

  • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;

  • 左、右子树也分别为二叉排序树。

        //建立二叉搜索树,左小右大
        bool insertBST(BTreeNode* &Node,int element){
            int data;
            data  =element;
            if(Node){
                if(element == Node->data){
                    return false;
                } else{
                    //与Node的数据比较
                    if(element >Node->data){
                        return insertBST(Node->left,element);
                    } else{
                        return insertBST(Node->right,element);
                    }
                }
            } else{
                Node = new BTreeNode;
                Node->data = data;
                return true;
            }
        }
        //二叉搜索树查找
        BTreeNode* BSTSearch(BTreeNode *Node,int data){
            if(Node == NULL || Node->data == data){
                return Node;
            } else{
                if(data > Node->data){
                    BSTSearch(Node->right,data);
                } else{
                    BSTSearch(Node->left,data);
                }
            }
        }
        //二叉搜索树删除元素
        bool deleteBST(BTreeNode* &Node,int data){
            if(!Node){
                return false;
            }
            if(data == Node->data){
                //找到元素,删除元素,找到子树替换当前位置
                deleteBSTNode(Node);
                return true;
            } else if(data > Node->data){
                //元素在右子树
                deleteBST(Node->right,data);
            } else{
                //元素在左子树
                deleteBST(Node->left,data);
            }
        }
         void deleteBSTNode(BTreeNode*& Node){
            BTreeNode *node = Node;
            //若有左子树,找左子树中最大的,或者右子树中最小的,替换当前节点
            if(Node->left){
                BTreeNode *left = Node->left;
                //左子树的最右边子树的父节点
                BTreeNode *Preer = Node->left;
                while(left->right){
                    Preer = left;
                    left = left->right;
                }
                if(Preer != left){
                    //删除pererd的右叶子
                    left->left =Node->left;
                    Preer->right = NULL;
                }
                Node = left;
            } else{
                Node = Node->right;
            }
            delete node;
        }
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值