二叉树的基本操作
1.创建对列
2.判断对列是否为空
3.入队列的操作
4.出队列操作
5.层次遍历
6.先序创建二叉树
7.中序遍历二叉树
8.后序遍历二叉树
9.树的深度
10.统计二叉树中节点的个数
11.统计二叉树的度为1的结点个数
#include <iostream>
using namespace std;
#define MAX 20
typedef struct Node//定义二叉树结构
{
char data;
struct Node *lchild,*rchild;//双叉树链表
}*BiTree,BiTNode;
typedef struct Queue//定义栈结构
{
BiTNode *front;//队列头指针
BiTNode *tail;//队列尾指针
int size;//队列空间大小
}Queue;
//创建队列
int InitQueue(Queue &Q)
{
Q.front = (BiTNode*)malloc(MAX * sizeof(BiTNode));
if(!Q.front)
{
return 0;
}
Q.tail = Q.front;
Q.size = MAX;
return 1;
}
//判断队列是否为空
bool EmptyQueue(Queue Q)
{
if(Q.tail == Q.front)
{
return true;
}
else
{
return false;
}
}
//入队列
int EnQueue(Queue &Q,BiTNode e)
{
if((Q.tail - Q.front + MAX) % MAX == MAX - 1)
{
return 0;
}
*Q.tail = e;
Q.tail++;
return 1;
}
//出队列
int DeQueue(Queue &Q,BiTNode &e)
{
if(Q.front == Q.tail)
{
return 0;
}
e = *Q.front;
Q.front++;
return 1;
}
//层次遍历
int levelTraverse(BiTree T)
{
if(NULL == T)
{
return 0;
}
BiTNode e;
Queue Q;
int levelcount = 0;//树的深度
int curlevel = 1;//本层剩余的未访问的节点数
int nextlevel = 0;//下一层未访问的节点数
InitQueue(Q);
EnQueue(Q,*T);
while(!EmptyQueue(Q))
{
DeQueue(Q,e);
printf("%c ",e.data);
curlevel--;
if(NULL != e.lchild)
{
EnQueue(Q,*e.lchild);
nextlevel ++;
}
if(NULL != e.rchild)
{
EnQueue(Q,*e.rchild);
nextlevel++;
}
if(0 == curlevel)
{
levelcount++;
printf("第%d层节点遍历结束!\n",levelcount);
curlevel = nextlevel;
nextlevel =0;
}
}
return 1;
}
void CreateBiTree(BiTree &T)//先序创建二叉树
{
char ch;
cin>>ch;
if(ch=='#') T=NULL;//使用#号表示左孩子或者右孩子为空为空
else{
T=new BiTNode;
T->data=ch;//为结点赋值
CreateBiTree(T->lchild);//使用递归为结点赋值
CreateBiTree(T->rchild);
}
}
void InOrderTraverse(BiTree T)//中序遍历输出
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
void PreOrderTraverse(BiTree T)//先序遍历输出
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)//后序遍历输出
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
int Depth(BiTree T)//树的深度
{
if(T==NULL)
return 0;
else
{
int m=Depth(T->lchild);
int n=Depth(T->rchild);
if(m>n) return (m+1);//寻找最深的结点,如果左孩子走的最深,就返回左孩子最深的数值
else return (n+1);//如果右孩子走的更深则返回右孩子最深的数值
}
}
int NodeCount(BiTree T)//统计二叉树中结点的个数
{
if(T==NULL) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;//左孩子加右孩子,再加上根节点
}
int LeafCount(BiTree T)//统计二叉树中叶子结点的个数
{
if(!T) return 0;
if(!T->lchild &&!T->rchild){//如果二叉树左孩子和右孩子皆为空,说明该二叉树根节点为叶子节点,加1.
return 1;
}else{
return LeafCount(T->lchild)+LeafCount(T->rchild);
}
}
int Node_1_Count(BiTree T)//统计二叉树的度为1的结点个数
{
if(!T) return 0;
if((!T->lchild)&&(T->rchild)||(T->lchild)&&(!T->rchild))
return 1 + Node_1_Count(T->lchild) + Node_1_Count(T->rchild);//只有左孩子或者右孩子为空的结点进行加一
else
return Node_1_Count(T->lchild) + Node_1_Count(T->rchild);
}
int main()
{
BiTree T;
//测试例子AB#CD##E##F#GH###
//测试例子ABD##D##E##CF##G##
cout<<"先序遍历输入(以#结束):";
CreateBiTree(T);
cout<<"中序遍历输出:";
InOrderTraverse(T);
cout<<endl<<"先序遍历输出:";
PreOrderTraverse(T);
cout<<endl<<"后序遍历输出:";
PostOrderTraverse(T);
cout<<endl<<"树的深度:"<<Depth(T);
cout<<endl<<"结点的个数:"<<NodeCount(T);
cout<<endl<<"叶结点的个数:"<<LeafCount(T);
cout<<endl<<"度为1的结点个数:"<<Node_1_Count(T);
}