二叉树以lchild-rchild链接方式存储,以菜单方式设计并完成功能任务:建立并存储树、输出前序遍历结果、输出中序遍历结果、输出后序遍历结果、交换左右子树、统计高度,其中对于中序、后序的遍历运算要求采用非递归方式。
#include <stdio.h>
#include <stdlib.h>#define maxsize 100
///二叉树结点
typedef struct BitNode{
char data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
///按先序序列创建二叉树
BitTree CreateBitTree(BitNode *T){
char data; ///按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
scanf("%c",&data);
if(data=='#'){
T=NULL;
}
else{
T=(BitTree)malloc(sizeof(BitNode));
T->data=data; ///生成根结点
T->lchild=CreateBitTree(T->lchild); ///构造左子树
T->rchild=CreateBitTree(T->rchild); ///构造右子树
}
return T;
}
///访问
void visit(BitNode *T){
if(T->data!='#')
printf("%c ",T->data);
}
///先序递归访问
void PreOrderTraver(BitTree T){
if(T!=NULL){
visit(T);
PreOrderTraver(T->lchild);
PreOrderTraver(T->rchild);
}
}
///中序递归访问
void InOrderTraver1(BitNode *T){
if(T!=NULL){
InOrderTraver1(T->lchild);
visit(T);
InOrderTraver1(T->rchild);
}
}
///中序非递归访问
void InOrderTraver2(BitTree T){
BitNode *p;
p=T;
BitTree s[maxsize];
int i=0;
do{
while(p!=NULL){
s[i]=p;
p=p->lchild;
i++;
}
if(i!=0){
p=s[i-1];i--;
visit(p);
p=p->rchild;
}
}while(i!=0||p!=NULL);
}
///后序递归访问
void AfterOrderTraver1(BitTree T){
if(T!=NULL){
AfterOrderTraver1(T->lchild);
AfterOrderTraver1(T->rchild);
visit(T);
}
}
///后序非递归访问
typedef struct St{
struct BTNode* data[maxsize];
int top;
}stack;
void AfterOrderTraver2(BitTree T){
stack s;
BitNode *p;
p=T;
int tag[maxsize/2];
s.top=0;
while(s.top!=0||p){
while(p!=NULL){
s.data[s.top++]=p;
tag[s.top-1]=0;
p=p->lchild;
}
while(s.top!=0&&tag[s.top-1]==1){
p=s.data[--s.top];
visit(p);
}
if(s.top!=0){
tag[s.top-1]=1;
p=s.data[s.top-1];
p=p->rchild;
}
else
break;
}
}
///求树的高度
int TreeHeight(BitTree T){
int rHeight=0;
int lHeight=0;
if(T==NULL)
return -1;
if(T->lchild!=NULL)
lHeight=TreeHeight(T->lchild);
else
lHeight=0;
if(T->rchild!=NULL)
rHeight=TreeHeight(T->rchild);
else
rHeight=0;
return (rHeight>lHeight)?(rHeight+1):(lHeight+1);
}
///交换左右子树
BitTree exchange(BitTree T){
BitTree temp;
if(T){
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
exchange(T->lchild);
exchange(T->rchild);
}
return T;
}
int main(){
BitTree T;
printf("---------------二叉树的遍历问题---------------\n");
printf("\n\t按先序序列创建二叉树:");
T=CreateBitTree(T);
printf("\n\t先序递归遍历:");
PreOrderTraver(T);
printf("\n\n\t中序递归遍历:");
InOrderTraver1(T);
printf("\n\n\t中序非递归遍历:");
InOrderTraver2(T);
printf("\n\n\t后序递归遍历:");
AfterOrderTraver1(T);
printf("\n\n\t后序非递归遍历:");
AfterOrderTraver2(T);
int i;
i=TreeHeight(T);
printf("\n\n\t该树的高度:%d\n",i);
T=exchange(T);
printf("\n\t交换左右子树后先序递归遍历:");
PreOrderTraver(T);
printf("\n");
return 0;
}