#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BTree;
typedef struct queue{
BTree numQ[MaxSize];
int front;
int rear;
}Queue;
Queue Q;
void Q_initilize()
{
Q.front = 0;
Q.rear = 0;
}
void Q_Push(BTree root)
{
Q.numQ[++Q.rear] = root;
}
BTree Q_Pop(BTree root)
{
return Q.numQ[++Q.front] ;
}
int Q_empty() { //判断对列是否为空
return Q.rear == Q.front;
}
/*
测试例子:AB##CD###
A
/ \
B C
/ \ / \
# # D #
/ \
# #
前序遍历建立树,一定要按先序遍历的结果输入并且
把叶子结点的左右孩子全部输成#
*/
void CreateBTree(BTree * T)
{
char ch;
scanf("%c", &ch);
if (ch == '#')
{ // 说明无结点了。
*T = NULL;
} else
{
*T = (BTree) malloc(sizeof(BiTNode));
if (T == NULL)
{ // 判断动态课间是否分配成功;
printf("error!\n");
return;
}
(*T)->data = ch;
// printf("%c",(*T)->data);
CreateBTree(&(*T)->lchild); // 向左遍历创建,传入的实参为指向(*T)->lchild的指针;
CreateBTree(&(*T)->rchild); // 向右遍历创建,
// 传入的实参为指向(*T)->rchild的指针;
}
}
//先序遍历
void preOrder(BTree * L)
{
if (*L != NULL)
{
putchar((*L)->data);
preOrder(&(*L)->lchild);
preOrder(&(*L)->rchild);
}
}
//中序遍历
void InOrder(BTree * L)
{
if (*L != NULL)
{
InOrder(&(*L)->lchild);
putchar((*L)->data);
InOrder(&(*L)->rchild);
}
}
//后序遍历
void LastOrder(BTree * L)
{
if (*L != NULL)
{
LastOrder(&(*L)->lchild);
LastOrder(&(*L)->rchild);
putchar((*L)->data);
}
}
//层次遍历
void LevelOrder(BTree T)
{
if(T == NULL) return;
Q_Push(T);
while(!Q_empty()){
BTree tmp = Q_Pop(T);
printf("%c ",tmp->data);
if(tmp->lchild)
Q_Push(tmp->lchild);
if(tmp->rchild)
Q_Push(tmp->rchild);
}
}
//树高
int PostTreeHeight(BTree * T)
{
int h = 0, hl = 0, hr = 0;
if (*T == NULL)
{
return 0;
} else
{
hl = PostTreeHeight(&(*T)->lchild);
hr = PostTreeHeight(&(*T)->rchild);
return h = (hr > hl) ? hr+1 : hl + 1;
}
}
int main()
{
int h=0;
BTree Tree;
CreateBTree(&Tree);
printf("前序遍历结果为:");
preOrder(&Tree);
putchar('\n');
printf("中序遍历结果为:");
InOrder(&Tree);
putchar('\n');
printf("后序遍历结果为:");
LastOrder(&Tree);
putchar('\n');
printf("层次遍历结果为:");
LevelOrder(Tree);
putchar('\n');
printf("树高为:");
h=PostTreeHeight(&Tree);
printf("%d",h);
}