1.数的构建(递归构建
typedef struct node *Node;
struct node{
Node left;
Node right;
int data;
};
void create_tree(Node &tree)
{
int n;
cin>>n;
if(n==-1)
tree=NULL;
else{
tree = new node();
tree->data=n;
create_tree(tree->left);
create_tree(tree->right);
}
}
2.树的遍历(递归和非递归
2.1 先序遍历
//非递归
void Preorder(Node tree)
{
cout<<endl<<"前序遍历:";
Node T=tree;
queue<Node>s1;
stack<Node>s;
while(T || !s.empty()){
while(T)
{
s1.push(T);
cout<<T->data<<" ";
s.push(T);
T=T->left;
}
if(!s.empty())
{
T=s.top();
s.pop();
T=T->right;
}
}
while(!s1.empty())
{
cout<<s1.front()->data<<" ";
s1.pop();
}
cout<<endl;
}
//递归
void preorder(Node tree)
{
if(tree)
{
cout<<tree->data<<" ";
preorder(tree->left);
preorder(tree->right);
}
}
2.2 中序遍历
//非递归
void Midorder(Node tree)
{
cout<<endl<<"中序遍历:";
Node T=tree;
stack<Node>s;
queue<Node>s1;
while(T || !s.empty()){
while(T)
{
s.push(T);
T=T->left;
}
if(!s.empty())
{
T=s.top();
s1.push(T);
cout<<T->data<<" ";
s.pop();
T=T->right;
}
}
while(!s1.empty())
{
cout<<s1.front()->data<<" ";
s1.pop();
}
cout<<endl;
}
//递归
void midorder(Node tree)
{
if(tree)
{
midorder(tree->left);
cout<<tree->data<<" ";
midorder(tree->right);
}
}
2.3后序遍历
//非递归
void Lastorder(Node tree)
{
cout<<endl<<"后序遍历:";
Node T=tree;
stack<Node>s;
stack<Node>s1;
while(T || !s.empty())
{
while(T)
{
s1.push(T);
s.push(T);
T=T->right;
}
if(!s.empty())
{
T=s.top();
s.pop();
T=T->left;
}
}
while(!s1.empty())
{
cout<<s1.top()->data<<" ";
s1.pop();
}
cout<<endl;
}
//递归
void lastorder(Node tree)
{
if(tree)
{
lastorder(tree->left);
lastorder(tree->right);
cout<<tree->data<<" ";
}
}
3.二叉搜索树的插入(递归
void insert(int data,Node &tree)
{
if(tree==NULL)
{
tree = new node();
tree->data=data;
tree->left=tree->right=NULL;
}
else
{
if(data>tree->data)
insert(data,tree->right);
else if(data<tree->data)
insert(data,tree->left);
}
}
4.二叉搜索树的删除(递归
Node findmin(Node tree)
{
if(tree)
while(tree->left)
{
tree=tree->left;
}
return tree;
}
void Delete(int data,Node &tree)
{
Node t;
if(tree==NULL)
cout<<"找不到该节点"<<endl;
else if(data>tree->data)
Delete(data,tree->right);
else if(data<tree->data)
Delete(data,tree->left);
else
{
if(tree->left&&tree->right)
{
t=findmin(tree->right);
tree->data=t->data;
Delete(tree->data,tree->right);
}
else{
t=tree;
if(tree->left)
tree=tree->left;
else if(tree->right)
tree=tree->right;
else
tree=NULL;
delete(t);
}
}
}
总代码:
#include<stack>
#include<queue>
#include<iostream>
using namespace std;
/*
3
1 5
2
3
1
-1
2
-1
-1
5
-1
-1
//插入4删除4
*/
typedef struct node *Node;
struct node{
Node left;
Node right;
int data;
};
void create_tree(Node &tree)
{
int n;
cin>>n;
if(n==-1)
tree=NULL;
else{
tree = new node();
tree->data=n;
create_tree(tree->left);
create_tree(tree->right);
}
}
void Preorder(Node tree)
{
cout<<endl<<"前序遍历:";
Node T=tree;
queue<Node>s1;
stack<Node>s;
while(T || !s.empty()){
while(T)
{
s1.push(T);
cout<<T->data<<" ";
s.push(T);
T=T->left;
}
if(!s.empty())
{
T=s.top();
s.pop();
T=T->right;
}
}
while(!s1.empty())
{
cout<<s1.front()->data<<" ";
s1.pop();
}
cout<<endl;
}
void preorder(Node tree)
{
if(tree)
{
cout<<tree->data<<" ";
preorder(tree->left);
preorder(tree->right);
}
}
void Midorder(Node tree)
{
cout<<endl<<"中序遍历:";
Node T=tree;
stack<Node>s;
queue<Node>s1;
while(T || !s.empty()){
while(T)
{
s.push(T);
T=T->left;
}
if(!s.empty())
{
T=s.top();
s1.push(T);
cout<<T->data<<" ";
s.pop();
T=T->right;
}
}
while(!s1.empty())
{
cout<<s1.front()->data<<" ";
s1.pop();
}
cout<<endl;
}
void midorder(Node tree)
{
if(tree)
{
midorder(tree->left);
cout<<tree->data<<" ";
midorder(tree->right);
}
}
void Lastorder(Node tree)
{
cout<<endl<<"后序遍历:";
Node T=tree;
stack<Node>s;
stack<Node>s1;
while(T || !s.empty())
{
while(T)
{
s1.push(T);
s.push(T);
T=T->right;
}
if(!s.empty())
{
T=s.top();
s.pop();
T=T->left;
}
}
while(!s1.empty())
{
cout<<s1.top()->data<<" ";
s1.pop();
}
cout<<endl;
}
void lastorder(Node tree)
{
if(tree)
{
lastorder(tree->left);
lastorder(tree->right);
cout<<tree->data<<" ";
}
}
void insert(int data,Node &tree)
{
if(tree==NULL)
{
tree = new node();
tree->data=data;
tree->left=tree->right=NULL;
}
else
{
if(data>tree->data)
insert(data,tree->right);
else if(data<tree->data)
insert(data,tree->left);
}
}
Node findmin(Node tree)
{
if(tree)
while(tree->left)
{
tree=tree->left;
}
return tree;
}
void Delete(int data,Node &tree)
{
Node t;
if(tree==NULL)
cout<<"找不到该节点"<<endl;
else if(data>tree->data)
Delete(data,tree->right);
else if(data<tree->data)
Delete(data,tree->left);
else
{
if(tree->left&&tree->right)
{
t=findmin(tree->right);
tree->data=t->data;
Delete(tree->data,tree->right);
}
else{
t=tree;
if(tree->left)
tree=tree->left;
else if(tree->right)
tree=tree->right;
else
tree=NULL;
delete(t);
}
}
}
int main()
{
Node tree;
create_tree(tree);
Preorder(tree);
preorder(tree);
Midorder(tree);
midorder(tree);
Lastorder(tree);
lastorder(tree);
insert(4,tree);
cout<<"\n\n插入后:";
Preorder(tree);
preorder(tree);
Midorder(tree);
midorder(tree);
Lastorder(tree);
lastorder(tree);
cout<<"\n\n删除后:";
Delete(4,tree);
Preorder(tree);
preorder(tree);
Midorder(tree);
midorder(tree);
Lastorder(tree);
lastorder(tree);
}
运行结果如下: