数据结构后序遍历完全二叉树
题目: 先创建一棵拥有n(>10)个节点的完全二叉树,然后分别利用递归算法和非递归算法后序遍历这棵二叉树,两次遍历的结果要相同。
题目讲解
- 题目主要是要求用两种方法来遍历这颗二叉树,其实递归的的很简单,用数组解决就行了,主要是这个非递归的,有点麻烦,用数组写不出来,只好换上了老师的方法,
- 然后老师的那种方法的缺点主要是要自己把数把树输进去,不能像数组那么简单,直接输入,比较简单。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 1024
#define OK 1
#define ERROR 0
int tree[1024];
typedef int ElemType;
typedef int Status;
typedef struct BTNode {
ElemType data;
struct BTNode *lchild,*rchild;
} BTree;
typedef struct St {
struct BTNode* data[MaxSize];
int top;
} Stack;
//1.按先序次序生成二叉树
BTree* CreateT() {
BTree *BT;
ElemType ch;
scanf("%d",&ch);
if(ch==0)
BT=NULL;
else {
BT=(BTree*)malloc(sizeof(BTree));
if(!BT) {
exit(0);
}
BT->data=ch;
BT->lchild=CreateT();
BT->rchild=CreateT();
}
return BT;
}
//4.后序遍历-非递归
Status PostOrder2(BTree *BT) {
Stack s,s2;
BTree *T;
int flag[MaxSize];
s.top=0;
T=BT;
while(s.top!=0||T) {
while(T) {
s.data[s.top++]=T;
flag[s.top-1]=0;
T=T->lchild;
}
while(s.top!=0&&flag[s.top-1]==1) {
T=s.data[--s.top];
printf("%3d",T->data);
}
if(s.top!=0) {
flag[s.top-1]=1;
T=s.data[s.top-1];
T=T->rchild;
} else
break;
}
return OK;
}
void PostTravel1(int *arr,int parentindex,int len) {
if(parentindex<=len) {
PostTravel1(arr,parentindex*2,len);
PostTravel1(arr,parentindex*2+1,len);
printf("%d ",parentindex);
}
}
int main() {
printf("请输入0或者1,选择递归遍历或者非递归遍历: ");
int n;
scanf("%d",&n);
if(n==0) {
int jiedian,i;
printf("请输入一个节点大于10的树:\n");
scanf("%d",&jiedian);
for(i=0; i<jiedian; i++)
tree[i]=i+1;
PostTravel1(tree,1,jiedian);
printf("\n后序遍历完成!\n");
}
else {
BTree *BT;
BT=CreateT();
if(PostOrder2(BT)) {
printf("\n非递归后序遍历完成!\n");
}
}
}
后面的话我看看能不能不用老师讲的方法写,自己来写一个用数组的,这样子比较简单!
后续还会更新的,请不要直接抄袭代码哦!