二叉搜索树的创建,查找,添加,删除操作
查找操作
bool searchBst(bstNode *root,int key)
{
if(root==nullptr)
{
return 0;
}
else if(key==root->val)
{
return true;
}
else if(key>root->val)
{
return searchBst(root->right,key);
}
else if(key<root->val)
{
return searchBst(root->left,key);
}
}
创建和增加操作
bool searchBstNode(bstNode *root,int key,bstNode *parent,bstNode *&curr)
{
if(root==nullptr)
{
curr=parent;
return 0;
}
else if(key==root->val)
{
curr=root;
return true;
}
else if(key>root->val)
{
return searchBstNode(root->right,key,root,curr);
}
else if(key<root->val)
{
return searchBstNode(root->left,key,root,curr);
}
}
void insertBst(bstNode *&root,int key)
{
bstNode * curr;
bstNode *temp;
if(!searchBstNode(root,key,nullptr,curr))
{
temp=new bstNode();
temp->val=key;
temp->left=temp->right=nullptr;
if(!curr)
{
root=temp;
}
else if(key<curr->val)
{
curr->left=temp;
}
else if(key>curr->val)
{
curr->right=temp;
}
}
else
{
return;
}
}
删除操作
void deleteNode(bstNode *&root)
{
bstNode* curr;
bstNode* temp;
if(!root->left)
{
curr=root;
root=root->right;
delete(curr);
}
else if (!root->right)
{
curr=root;
root=root->left;
delete(curr);
}
else{
curr=root;
temp=root->left;
while(temp->left)
{
curr=temp;
temp=temp->right;
}
root->val=temp->val;
if(curr!=root)
{
curr->right=temp->left;
}
else
{
curr->left=temp->left;
}
delete temp;
}
}
void deleteBst(bstNode *&root,int key)
{
if(!root)
{
return;
}
if(key==(root->val))
{
deleteNode(root);
cout<<"删除操作执行成功"<<endl;
}
else if(key>root->val)
{
deleteBst(root->right,key);
}
else if(key<root->val)
{
deleteBst(root->left,key);
}
}
层序遍历操作
void layerBstTraveral(bstNode *root)
{
if(root==nullptr)
{
cout<<"当前树并不存在"<<endl;
}
queue<bstNode *>que;
que.push(root);
while(!que.empty())
{
bstNode *curr=que.front();
cout<<curr->val<<" ";
if(curr->left)
{
que.push(curr->left);
}
if(curr->right)
{
que.push(curr->right);
}
que.pop();
}
}
代码汇总
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
struct bstNode
{
int val;
bstNode *left;
bstNode *right;
};
bool searchBst(bstNode *root,int key)
{
if(root==nullptr)
{
return 0;
}
else if(key==root->val)
{
return true;
}
else if(key>root->val)
{
return searchBst(root->right,key);
}
else if(key<root->val)
{
return searchBst(root->left,key);
}
}
bool searchBstNode(bstNode *root,int key,bstNode *parent,bstNode *&curr)
{
if(root==nullptr)
{
curr=parent;
return 0;
}
else if(key==root->val)
{
curr=root;
return true;
}
else if(key>root->val)
{
return searchBstNode(root->right,key,root,curr);
}
else if(key<root->val)
{
return searchBstNode(root->left,key,root,curr);
}
}
void insertBst(bstNode *&root,int key)
{
bstNode * curr;
bstNode *temp;
if(!searchBstNode(root,key,nullptr,curr))
{
temp=new bstNode();
temp->val=key;
temp->left=temp->right=nullptr;
if(!curr)
{
root=temp;
}
else if(key<curr->val)
{
curr->left=temp;
}
else if(key>curr->val)
{
curr->right=temp;
}
}
else
{
return;
}
}
void layerBstTraveral(bstNode *root)
{
if(root==nullptr)
{
cout<<"当前树并不存在"<<endl;
}
queue<bstNode *>que;
que.push(root);
while(!que.empty())
{
bstNode *curr=que.front();
cout<<curr->val<<" ";
if(curr->left)
{
que.push(curr->left);
}
if(curr->right)
{
que.push(curr->right);
}
que.pop();
}
}
void deleteNode(bstNode *&root)
{
bstNode* curr;
bstNode* temp;
if(!root->left)
{
curr=root;
root=root->right;
delete(curr);
}
else if (!root->right)
{
curr=root;
root=root->left;
delete(curr);
}
else{
curr=root;
temp=root->left;
while(temp->left)
{
curr=temp;
temp=temp->right;
}
root->val=temp->val;
if(curr!=root)
{
curr->right=temp->left;
}
else
{
curr->left=temp->left;
}
delete temp;
}
}
void deleteBst(bstNode *&root,int key)
{
if(!root)
{
return;
}
if(key==(root->val))
{
deleteNode(root);
cout<<"删除操作执行成功"<<endl;
}
else if(key>root->val)
{
deleteBst(root->right,key);
}
else if(key<root->val)
{
deleteBst(root->left,key);
}
}
int main()
{
vector<int>a={62,88,58,47,35,73,51,99,37,93};
bstNode *root=nullptr;
for(auto i:a)
{
insertBst(root,i);
}
cout<<"层序遍历的结果:";
layerBstTraveral(root);
cout<<endl;
cout<<"查找99在树中是否存在: ";
cout<<searchBst(root,99)<<endl;
cout<<"查找100在树中是否存在: ";
cout<<searchBst(root,100)<<endl;
cout<<"删除结点58: ";
deleteBst(root,58);
cout<<"层序遍历的结果:";
layerBstTraveral(root);
cout<<endl;
}