#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;
}
二叉搜索树C++版
猜你喜欢
转载自blog.csdn.net/vaemusicsky/article/details/81587907
今日推荐
周排行