二叉搜索树C++版

#include <iostream>
using namespace std;

class BTNode{
public:
    int data;
    BTNode* lChild;
    BTNode* rChild;
    BTNode(int data):data(data), lChild(nullptr), rChild(nullptr){}
};

class BSTree{
public:
    BTNode* root;
public:
    //构造空树 
    BSTree(){
        root = nullptr;
    }
    //查找结点 
    BTNode* search(int data, BTNode*& parent){
        BTNode* cur = root;
        parent = nullptr;
        while(cur){
            if(data == cur->data)
                return cur;
            else if(data > cur->data){
                parent = cur;
                cur = cur->rChild;
            }
            else{
                parent = cur;
                cur = cur->lChild;
            }   
        }
        return nullptr;
    }
    //插入结点
    void insert(int data){
        if(!root)
            root = new BTNode(data);
        else{
            BTNode* parent;
            //先查找值为data的结点,如果没有则返回空指针,再执行插入操作 
            BTNode* cur = search(data, parent);
            if(!cur){
                if(data > parent->data)
                    parent->rChild = new BTNode(data);
                else
                    parent->lChild = new BTNode(data);
            }  
        }
    }
    //中序遍历,二叉搜索树的中序遍历是一个有序序列 
    void inOrder(BTNode*& root){
        BTNode* cur = root;
        if(cur){
            inOrder(cur->lChild);
            cout << cur->data << endl;
            inOrder(cur->rChild);
        }
    } 
    void del(int data){
        BTNode* parent = nullptr;
        BTNode* cur = search(data, parent);
        if(cur){
            if(cur->lChild && cur->rChild){ 
                //如果要删除的结点左右孩子都存在,则找到其左孩子的最大结点替换之
                //转换成有0个或1个孩子的情况 
                BTNode* p = cur->lChild;
                BTNode* pp = cur;
                //一直往右走 
                while(p->rChild){ 
                    pp = p;
                    p = p->rChild;
                } 
                cur->data = p->data; 
                cur = p;//此时cur指向要删除的结点,此结点至多有一个孩子
                parent = pp;
            }
            BTNode* child = nullptr;//保存当前结点的孩子结点 
            if(cur->lChild)
                child = cur->lChild;
            else
                child = cur->rChild;
            if(cur==root)
                root = child;
            else{
                if(parent->lChild == cur)
                    parent->lChild = child;
                else
                    parent->rChild = child;
            } 
            delete cur;
        }
    } 
};


int main(){
    BSTree bstree;
    BTNode* cur = nullptr;
    BTNode* parent = nullptr;
    bstree.insert(30); 
    bstree.insert(5);
    bstree.insert(40);
    bstree.insert(2);
    bstree.insert(35);
    bstree.insert(80);
    bstree.insert(32);
    bstree.insert(31);
    bstree.insert(33);
    bstree.insert(60);
    bstree.insert(85);
    bstree.del(30);
    bstree.inOrder(bstree.root);
//  cur = bstree.search(30, parent);
//  if(cur){
//      cout << "找到了" << endl; 
//  }
//  else{
//      cout << "404" << endl;
//  }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/vaemusicsky/article/details/81587907
今日推荐