#include<iostream>
#include<malloc.h>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
typedef struct tree
{
int data;
struct tree *lchild,*rchild;
}node,*bst;
void grow(bst &t,int data)//二叉树生成
{
if(t==NULL)
{
t= new node;//这里经常忘记!!!!!
t->data=data;
t->lchild=t->rchild=NULL;
}
else if(data>=t->data) grow(t->rchild,data);
else if(data<t->data) grow(t->lchild,data);
}
void prego(bst t)
{
if(t)
{
cout<<t->data<<" ";
prego(t->lchild);
prego(t->rchild);
}
}
void midgo(bst t)
{
if(t)
{
midgo(t->lchild);
cout<<t->data<<" ";
midgo(t->rchild);
}
}
void reargo(bst t)
{
if(t)
{
reargo(t->lchild);
reargo(t->rchild);
cout<<t->data<<" ";
}
}
void search(bst t,int num)
{
if(t==NULL) cout<<"0"<<endl;//这里可要注意了,这个条件必须写最前面,不然NULL->data就死定了
else if(t->data==num) cout<<"1"<<endl;
else if(t->data<num) search(t->rchild,num);
else if(t->data>num) search(t->lchild,num);
}
void nonerecursivemid(bst t,stack<bst> &s)//非递归中序遍历
{
while(!s.empty()||t)
{
if(t)
{
s.push(t);//这里卡了很久,写成了t->lchild显然不行,这样第一个结点都存不进去
t=t->lchild;
}
else
{
t=s.top();
cout<<t->data<<" ";
s.pop();
t=t->rchild;
}
}
cout<<endl;
}
void levelgo(bst t,queue<bst> q)
{
q.push(t);
while(!q.empty())
{
t=q.front();
q.pop();
cout<<t->data<<" ";
if(t->lchild)q.push(t->lchild);
if(t->rchild)q.push(t->rchild);
}
cout<<endl;
}
void change(bst &t)
{
if(!t) return ;
swap(t->lchild,t->rchild);
change(t->lchild);
change(t->rchild);
}
int treedepth(bst t)
{
if(!t) return 0;
return max(treedepth(t->lchild),treedepth(t->rchild))+1;
}
int leafnode(bst t)
{
//如果不写这句,那么当这是一颗空树或者说当某一个节点只有一个孩子的时候会有bug
if(!t) return 0;//这一句太关键了,浪费好多时间都没想到这个
if(!t->lchild&&!t->rchild) return 1;
return leafnode(t->lchild)+leafnode(t->rchild);
}
int main()
{
bst T=NULL;//这里总想着搞一个初始化函数分配空间,实际上一个生成节点函数就够了
//创建树
int m,data;
cin>>m;
for(int i=0;i<=m-1;i++)
{
cin>>data;
grow(T,data);
}
//先中后序打印
prego(T);cout<<endl;
midgo(T);cout<<endl;
reargo(T);cout<<endl;
//查找
int num;
cin>>num;
search(T,num);
cin>>num;
search(T,num);
//插入
cin>>data;
grow(T,data);
//先中后序打印
prego(T);cout<<endl;
midgo(T);cout<<endl;
reargo(T);cout<<endl;
//非递归中序遍历
stack<bst> s;
nonerecursivemid(T,s);
//层次遍历
queue<bst> q;
levelgo(T,q);
//交换子树
change(T);
//先中后序打印
prego(T);cout<<endl;
midgo(T);cout<<endl;
reargo(T);cout<<endl;
//交换子树
change(T);
//先中后序打印
prego(T);cout<<endl;
midgo(T);cout<<endl;
reargo(T);cout<<endl;
//树的深度
cout<<treedepth(T)<<endl;
//叶子结点总数
cout<<leafnode(T)<<endl;
return 0;
}
8608 实现二叉排序树的各种算法(2)
最新推荐文章于 2023-05-29 09:59:10 发布