二叉搜索树的查找,添加和删除

5 篇文章 0 订阅
5 篇文章 0 订阅
//
//  main.cpp
//  niukewang
//
//  Created by qj on 2019/8/17.
//  Copyright © 2019 qj. All rights reserved.
//

#include <iostream>
#include <vector>

using namespace std;

//二叉搜索树的查找,添加和删除
struct TreeNode{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x):val(x),left(NULL),right(NULL){
        
    }
};

//二叉搜索树的添加

TreeNode* insert(TreeNode* BST,int data){
    if(!BST){//如果原树为空,生成并返回一个结点的二叉搜索树
        BST = new TreeNode(data);
    }else{//开始要插入元素的位置
        if(data < BST->val  ){
            BST->left = insert(BST->left,data);//递归插入左子树
        }else if(data > BST->val){
            BST->right = insert(BST->right,data);//递归插入右子树
        }
        //如果元素已经存在,什么都不做
    }
    return BST;
}
//二叉树的查找
TreeNode * find(TreeNode* BST,int data){
    while(BST){
        if(data < BST->val){
            BST = BST->left;
        }else if(data > BST->val){
            BST = BST->right;
        }else{
            break;
        }
    }
    return BST;
}
//查找最小值结点
TreeNode * findMin(TreeNode* BST){
    if(BST){
        while(BST->left){
            BST = BST->left;
        }
    }
    return BST;
}
//查找最大值结点
TreeNode *  findMax(TreeNode* BST){
    if(BST){
        while(BST->right){
            BST = BST->right;
        }
    }
    return BST;
}

//删除结点
TreeNode * deleteNode(TreeNode *BST,int data){
    if(!BST){
        cout << "要删除的元素未找到" << endl;
    }else if(data < BST->val){
        //左子树递归删除
        BST->left = deleteNode(BST->left,data);
    }else if(data > BST->val){
        //右子树递归删除
        BST->right = deleteNode(BST->right, data);
    }else{//找到要删除的结点
        //被删除结点有左右两个子结点
        if(BST->left && BST->right){
            //在右子树中找到最小的元素填充删除结点
            //1首先找到右子树里面的最小值,2将其值复制给当前结点,3删除该结点
            TreeNode *temp = findMin(BST->right);
            BST->val = temp->val;
            //在删除结点的右子树中删除最小元素
            BST->right = deleteNode(BST->right,temp->val);
        }else{//被删除结点有一个或无子结点
            TreeNode *temp = BST;
            if(BST->left){//有左孩子
                BST = BST->left;
            }else if(BST->right){//有右孩子
                BST = BST->right;
            }else{//被删除结点是叶子结点
                BST = NULL;
            }
            delete temp;//释放内存
        }
    }
    return BST;
}


void preOrder(TreeNode* BST){
    if(BST){
        cout << BST->val << endl;
        preOrder(BST->left);
        preOrder(BST->right);
    }
}
void inOrder(TreeNode* BST){
    if(BST){
        inOrder(BST->left);
        cout << BST->val << endl;
        inOrder(BST->right);
    }
}

int main(int argc, const char * argv[]) {

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值