
代码演示:
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
#define NULL 0
#define OK 1
#define False 0
typedef char TElemType;
typedef int Status;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode,*BiTree;
Status CreateBiTree(BiTree *T){
char ch;
ch = getchar();
if(ch=='#') (*T) = NULL;
else {
(*T)=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
return OK;
}
Status PreOrder(BiTree T){
if(T){
printf("%2c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
return OK;
}
return False;
}
Status InOrder (BiTree T) {
if (T) {
InOrder(T->lchild);
printf("%2c",T->data);
InOrder(T->rchild);
return OK;
}
return False;
}
Status PostOrder (BiTree T) {
if (T) {
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%2c",T->data);
return OK;
}
return OK;
}
Status LevelOrder(BiTree T){
BiTree Queue[MAX],b;
int front,rear;
front=rear=0;
if(T) {
Queue[rear++]=T;
while(front!=rear){
b=Queue[front++];
printf("%2c",b->data);
if(b->lchild!=NULL){
Queue[rear++]=b->lchild;
}
if(b->rchild!=NULL){
Queue[rear++]=b->rchild;
}
}
}
}
int depth(BiTree T) {
int depL,depR;
if (T==NULL) return False;
else {
depL = depth(T->lchild);
depR = depth(T->rchild);
return depL > depR ? depL+1:depR+1;
}
}
int getNodeNUm(BiTree T){
if (!T) return False;
else {
return getNodeNUm(T->lchild) + getNodeNUm(T->rchild) + 1;
}
}
int getLeafNodeNum(BiTree T){
static LeafCount = 0;
if(!T) return False;
else {
getLeafNodeNum(T->lchild);
getLeafNodeNum(T->rchild);
if ((!T->lchild) && (!T->rchild)) {
LeafCount++;
}
}
return LeafCount;
}
Status changePos(BiTree Root){
if (Root == NULL) return OK;
else {
changePos(Root->lchild);
changePos(Root->rchild);
BiTNode *temp;
temp = Root->lchild;
Root->lchild = Root->rchild;
Root->rchild = temp;
return OK;
}
}
int main(){
BiTree T=NULL;
printf("\n(Create a Binary Tree )建立一棵二叉树T:\n");
CreateBiTree(&T);
printf("==============================");
printf("\nThe PreOrder(先序序列为)is:\n");
PreOrder(T);
printf("\n==============================");
printf("\nThe InOrder(中序序列为)is:\n");
InOrder(T);
printf("\n==============================");
printf("\nThe PostOrder(后序序列为)is:\n");
PostOrder(T);
printf("\n==============================");
printf("\nThe LevelOrder(层次序列为)is:\n");
LevelOrder(T);
printf("\n==============================");
printf("\nThe depth(深度)is: %d\n",depth(T));
printf("\n==============================\n");
printf("二叉树节点个数:%d",getNodeNUm(T));
printf("\n==============================\n");
printf("二叉树叶子节点个数:%d",getLeafNodeNum(T));
printf("\n==============================\n");
if (changePos(T)) {
printf("二叉树每个结点的左右子树交换位置成功");
} else {
printf("二叉树每个结点的左右子树交换位置失败");
};
printf("\n交换后的(层次序列为)is:\n");
LevelOrder(T);
printf("\n==============================\n");
return 0;
}
效果演示:
