#include<iostream>
#include<queue>
using namespace std;
typedef struct Tree
{
char data;
struct Tree * left;
struct Tree * right;
}TT,*TB;
void pre_create_tree(TB & tree)
{
char a;
cin>>a;
tree = new struct Tree;
if(a!='#')
{
tree->data = a;
pre_create_tree(tree->left);
pre_create_tree(tree->right);
}
else
{
tree = NULL;
}
}
void show(TB & tree,int model,bool is_down_line)//先序遍历0 中序1 后序2 层次3
{
if(model==0)
{
if(tree!=NULL)
{
cout<<tree->data;
show(tree->left,0,false);
show(tree->right,0,false);
}
}
else if(model==1)
{
if(tree!=NULL)
{
show(tree->left,1,false);
cout<<tree->data;
show(tree->right,1,false);
}
}
else if(model==2)
{
if(tree!=NULL)
{
show(tree->left,2,false);
show(tree->right,2,false);
cout<<tree->data;
}
}
else if(model==3)
{
if(tree!=NULL)
{
queue<TB> tb;
tb.push(tree);
while(!tb.empty())
{
int queue_size = tb.size();
TB node = tb.front();
tb.pop();
cout<<node->data;
if(node->left)
{
tb.push(node->left);
}
if(node->right)
{
tb.push(node->right);
}
}
}
}
if(is_down_line)
{
cout<<endl;
}
}
void delete_tree(TB & tree)//销毁一颗树
{
if(tree==NULL)
{
return ;
}
delete_tree(tree->left);
delete_tree(tree->right);
if(tree!=NULL)
{
delete tree;
tree = NULL;
}
}
void show_node_num(TB & tree)
{
if(tree==NULL)
{
cout<<endl<<"节点个数:"<<0<<endl;
return ;
}
int sum=1;
queue<TB> tb;
tb.push(tree);
while(!tb.empty())
{
int queue_size = tb.size();
TB node = tb.front();
tb.pop();
if(node->left)
{
sum++;
tb.push(node->left);
}
if(node->right)
{
sum++;
tb.push(node->right);
}
}
cout<<endl<<"节点个数:"<<sum<<endl;
}
int dushu(TB & tree,int model)
{
if(model==0)
{
if(tree==NULL)
{
return 0;
}
else
{
if(tree->left==NULL&&tree->right==NULL)
{
return dushu(tree->left,0)+dushu(tree->right,0)+1;
}
else
{
return dushu(tree->left,0)+dushu(tree->right,0)+0;
}
}
}
else if(model==1)
{
if(tree==NULL)
{
return 0;
}
else
{
if((tree->left!=NULL&&tree->right==NULL)||(tree->left==NULL&&tree->right!=NULL))
{
return dushu(tree->left,1)+dushu(tree->right,1)+1;
}
else
{
return dushu(tree->left,1)+dushu(tree->right,1)+0;
}
}
}
else if(model==2)
{
if(tree==NULL)
{
return 0;
}
else
{
if(tree->left!=NULL&&tree->right!=NULL)
{
return dushu(tree->left,2)+dushu(tree->right,2)+1;
}
else
{
return dushu(tree->left,2)+dushu(tree->right,2)+0;
}
}
}
}
void show_tree_du(TB & tree,int model)
{
if(tree==NULL)
{
cout<<endl<<"度数为"<<model<<":"<<0<<endl;
return ;
}
if(tree==NULL&&model==0)
{
cout<<endl<<"度数为"<<model<<":"<<1<<endl;
}
else
{
cout<<endl<<"度数为"<<model<<":"<<dushu(tree,model)<<endl;
}
}
int height_num(TB & tree)
{
if(tree==NULL)
{
return 0;
}
else
{
return height_num(tree->left)+height_num(tree->right)+1;
}
}
void show_height_num(TB & tree)
{
cout<<endl<<"高度:"<<height_num(tree)<<endl;
}
int main()
{
TB tree;
pre_create_tree(tree);
cout<<"先序:";
show(tree,0,true);
cout<<"中序:";
show(tree,1,true);
cout<<"后序:";
show(tree,2,true);
cout<<"非递归层序:";
show(tree,3,true);
show_node_num(tree);
show_tree_du(tree,0);
show_tree_du(tree,1);
show_tree_du(tree,2);
show_height_num(tree);
delete_tree(tree);
return 0;
}
二叉树的创建,先中后序遍历,层序遍历,输出度数为0,1,2的节点,输出深度
最新推荐文章于 2022-03-29 14:52:07 发布