#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef char ElemType;
typedef struct SqStack{
ElemType data[MAXSIZE];
int top;
}SqStack;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTreeNode,*BiTree;
typedef struct Queue{
BiTree data[MAXSIZE];
int front,rear;
}Queue;
int onesum=0,twosum=0;
void InitQueue(Queue &Q)//队列初始化
{
Q.rear=Q.front=-1;
}
void InQueue(Queue &Q,BiTree BT)//入队
{
Q.data[++Q.rear] = BT;
}
BiTree DeQueue(Queue &Q,BiTree BT)//出队
{
BT = Q.data[Q.front--];
return BT;
}
bool IsEmpty(Queue Q)
{
if (Q.front == Q.rear)
return 1;
return 0;
}
void InitSqStack(SqStack &S)//初始化栈
{
S.top=-1;
}
void Push(SqStack &S,ElemType e)//入栈
{
S.data[++S.top] = e;
}
void Pop(SqStack &S,ElemType &e)//出栈
{
e = S.data[S.top--];
}
void print(SqStack S)//打印栈
{
int i=1;
printf("栈的内容为:");
for(i;i<=S.top;i++)
printf("%C",S.data[i]);
printf("\n");
}
void InitBiTree(BiTree BT)//构建空树
{
BT=NULL;
}
BiTree PreCreateBiTree(BiTree *BT)//先序递归建立二叉树
{
ElemType c;
scanf("%c",&c);
if(c == '#')
*BT=NULL;
else
{
*BT=(BiTree)malloc(sizeof(BiTreeNode));
(*BT)->data = c;
(*BT)->lchild = PreCreateBiTree(&((*BT)->lchild));
(*BT)->rchild = PreCreateBiTree(&((*BT)->rchild));
}
return *BT;
}
void PostSqStack(SqStack &S)//后序建栈
{
ElemType c;
c=getchar();
while(c!='\n')
{
Push(S,c);
c=getchar();
}
}
BiTree PostCreateBiTree(BiTree *BT,SqStack &S)//后序递归建立二叉树
{
ElemType c;
if(S.top>-1)
Pop(S,c);
if(c=='#')
*BT=NULL;
else
{
(*BT) = (BiTree)malloc(sizeof(BiTreeNode));
(*BT)->rchild = PostCreateBiTree(&((*BT)->rchild),S);
(*BT)->lchild = PostCreateBiTree(&((*BT)->lchild),S);
(*BT)->data = c;
}
return *BT;
}
int GetTreeDepth(BiTree BT)//获取树的深度
{
if (!BT)
return 0;
int left,right;
left = GetTreeDepth(BT->lchild);
right =GetTreeDepth(BT->rchild);
if (left>=right)
return left+1;
return right+1;
}
void OneTwoSum(BiTree BT)//计算出单节点和双结点的个体
{
if(BT)
{
if(BT->lchild && BT->rchild)
twosum++;
else if(BT->lchild||BT->rchild)
onesum++;
printf("%c ",BT->data);
OneTwoSum(BT->lchild);
OneTwoSum(BT->rchild);
}
}
void PreVisit(BiTree BT)//先序访问二叉树
{
if(BT)
{
printf("%c ",BT->data);
PreVisit(BT->lchild);
PreVisit(BT->rchild);
}
}
void InorderVisit(BiTree BT)//中序访问二叉树
{
if(BT)
{
InorderVisit(BT->lchild);
printf("%c ",BT->data);
InorderVisit(BT->rchild);
}
}
void PostVisit(BiTree BT)//后序访问二叉树
{
if(BT)
{
PostVisit(BT->lchild);
PostVisit(BT->rchild);
printf("%c ",BT->data);
}
}
void Exchange(BiTree BT)//交换左右树
{
BiTree temp;
if(BT)
{
temp=BT->lchild;
BT->lchild=BT->rchild;
BT->rchild=temp;
Exchange(BT->lchild);
Exchange(BT->rchild);
}
}
int main()
{
BiTree BT;
SqStack S;
Queue Q;
InitBiTree(BT);//构建空树
// printf("请输入后序表达式:");
// PostSqStack(S);//把后序表达式存入栈中
// PostCreateBiTree(&BT,S);//后序建树
printf("请输入先序表达式:") ;
PreCreateBiTree(&BT);//先序建树
if(BT == NULL)
{
printf("树为空\n");
exit(0);
}
printf("先序遍历二叉树为:");
OneTwoSum(BT);//计算出单节点和双结点的个体
printf("\n中序遍历二叉树为:");
InorderVisit(BT);
printf("\n后序遍历二叉树为:");
PostVisit(BT);
printf("\n单节点个数为:");
printf("%d\n",onesum);//打印单结点个数
printf("双节点个数为:");
printf("%d\n",twosum);//打印双结点个数
Exchange(BT);//交换二叉树
printf("交换后的二叉树为:");
PreVisit(BT);//访问交换后二叉树
printf("\n该树的深度为:%d\n",GetTreeDepth(BT));
}
输入:
输出: