#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>
#define MAX_SIZE 10
typedef struct BiNode{
char ch;
struct BiNode *lchild, *rchild;
}BiNode;
typedef struct Stack{
BiNode * data[MAX_SIZE]; //属性:线性表
int size; //属性:堆栈的实际大小
int top; //属性:栈顶
}Stack;
bool isEmpty(Stack *);
bool isFull(Stack *);
void initStack(Stack *s){
s->size=MAX_SIZE;
s->top=-1;
}
void push(Stack *s,BiNode *p){
if(!isFull(s)){
s->data[++(s->top)] = p;
}
}
BiNode* pop(Stack *s){
if(!isEmpty(s)){
return s->data[s->top--];
}
}
bool isEmpty(Stack *s){
if(s->top == -1)
return true;
else
return false;
}
bool isFull(Stack *s){
if(s->top+1 == s->size)
return true;
else
return false;
}
char getval(char *str){
static int i=0;
return str[i++]; //*(str+i++);
}
BiNode * create(BiNode *bt,char *str){ //创建二叉树
char c=getval(str);
if(c=='#'){
bt=NULL;
}else{
bt=(BiNode *)malloc(sizeof(BiNode));
bt->ch=c;
bt->lchild=create(bt->lchild,str);
bt->rchild=create(bt->rchild,str);
}
return bt;
}
void preOrder(BiNode *bt){ //非递归前序遍历
BiNode *p=bt;
Stack s;
initStack(&s);
while(p||!isEmpty(&s)){
if(p){
printf("%c",p->ch);
push(&s,p);
p=p->lchild;
}else{
BiNode *q=pop(&s);
p=q->rchild;
}
}
printf("\n");
}
void inOrder(BiNode *bt){ //非递归中序遍历
BiNode *p=bt;
Stack s;
initStack(&s);
while(p||!isEmpty(&s)){
if(p){
push(&s,p);
p=p->lchild;
}else{
BiNode *q=pop(&s);
printf("%c",q->ch);
p=q->rchild;
}
}
printf("\n");
}
void postOrder(BiNode *bt){ //非递归后序遍历
if(bt==NULL)
return;
BiNode *p=bt;
Stack s;
int i=0;
char temp[MAX_SIZE]; //将栈中弹出的元素放入数组
initStack(&s);
push(&s,p); //将根节点压入栈
while(!isEmpty(&s)){
p=pop(&s); //弹出节点
temp[i++]=p->ch; //将弹出节点的值放入数组
if(p->lchild!=NULL)
push(&s,p->lchild); //左子树压栈
if(p->rchild!=NULL)
push(&s,p->rchild); //右子树压栈
}
while(i>0){ //倒序输出
printf("%c",temp[--i]);
}
}
int main(void){
char *str="AB#D##C##";
BiNode * root=create(root,str);
preOrder(root);
inOrder(root);
postOrder(root);
return 0;
}
二叉树的非递归遍历
最新推荐文章于 2024-10-24 18:46:43 发布