#include<iostream>
#include<queue>
using namespace std;
//疑问1:如何进行中序进行创建
typedef struct Node{
char date;
Node *lchild,*rchild;
}Node,*BTree;
void PreCreateBTree(BTree &T);//先序创建
void vist(BTree node){cout<<node->date;}
void PreOderBTree(BTree T,void(*vist) (BTree));//先序遍历
void InOderBTree(BTree T,void(*vist) (BTree));//中序遍历
void CountLeaf(BTree T,int &count);//求叶子节点数
int CountLeaf(BTree T);//求叶子数(左右树之和)
//求树的高度 //为什么这样就可以?????
int CountHigh(BTree T);//求树的高度
int CountD(BTree T);//求树的结点数(左子树节点+右子树节点+根 )
void CountD2(BTree T,int &num);//通过遍历一遍求结点
void LeavelTree(BTree T);//层次遍历
int count,num;
int main(){
BTree T;
PreCreateBTree(T);
//InOderBTree(T,vist);
cout<<"层次遍历:"<<endl;
LeavelTree(T);
cout<<endl<<"先序遍历:"<<endl;
PreOderBTree(T,vist);
cout<<endl;
CountLeaf(T,count);
cout<<"叶子数: "<<count<<endl;
cout<<"叶子数: "<<CountLeaf(T)<<endl;
cout<<"树高: "<<CountHigh(T)<<endl;
cout<<"结点数:"<<CountD(T)<<endl;
CountD2(T,num);
cout<<"结点数:"<<num<<endl;
}
void PreCreateBTree(BTree &T){
char ch;
cin>>ch;
if(ch=='#')
T=NULL;
else{
T=new Node;
if(T==NULL) cout<<"分配空间不足"<<endl;
T->date=ch;
PreCreateBTree(T->lchild);
PreCreateBTree(T->rchild);
}
}
void PreOderBTree(BTree T,void(*vist) (BTree)){
if(T){
vist(T);
PreOderBTree(T->lchild,vist);
PreOderBTree(T->rchild,vist);
}
else
cout<<"#";
}
void InOderBTree(BTree T,void(*vist) (BTree)){
if(T){
InOderBTree(T->lchild,vist);
vist(T);
InOderBTree(T->rchild,vist);
}
else
cout<<"#";
}
void CountLeaf(BTree T,int &count){
if(T)
{
if(T->lchild==NULL&&T->rchild==NULL)
count++;
else{
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
}
}
int CountLeaf(BTree T){
if(T==NULL) return 0;
else{
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else{
int l=CountLeaf(T->lchild);
int r=CountLeaf(T->rchild);
return l+r;
}
}
}
int CountHigh(BTree T){
if(!T)
return 0;
else{
int l=CountHigh(T->lchild)+1;
int r=CountHigh(T->rchild)+1;
return (l>r)?l:r;
}
}
int CountD(BTree T){//左子树节点+右子树节点+根
if(!T)
return 0;
else{
int l=CountD(T->lchild);
int r=CountD(T->rchild);
return l+r+1;
}
}
void CountD2(BTree T,int &num){//遍历求结点数
if(T){
num++;
CountD2(T->lchild,num);
CountD2(T->rchild,num);
}
else
num=num+0;
}
void LeavelTree(BTree T){
queue<BTree> myq;
if(T){
myq.push(T);
}
while(!myq.empty()){
Node *node=myq.front();
cout<<node->date;
myq.pop();
if(node->lchild)
myq.push(node->lchild);
if(node->rchild)
myq.push(node->rchild);
}
}
二叉树的基本操作
最新推荐文章于 2020-09-15 19:40:38 发布