1、中序非递归遍历序列二叉树
同学们一定要留意一下这一步: pop(s,&q);这一步涉及到一个二级指针的问题(当然不用二级指针也可以解决问题,只不过大多部分教材都会用二级指针来解题),二级指针的问题我直接上图,其实二级指针就是一个抽屉里面放另外一个抽屉的钥匙罢啦;
#include <stdio.h>
#include <mm_malloc.h>
#define MAXSIZE 50
#define OK 1
#define ERROR -1
typedef struct{
char data;
struct BiNode *LChild;
struct BiNode *RChild;
}BiTNode,*BiTree;
typedef struct SqeStack{
BiTree elem[MAXSIZE];
int top;
}SqeStack,*Sqe;
int main(){
void PreCreateBiTree(BiTree *T);
void UnrecursiveInorder(BiTree T);
BiTree T ;
//先序创建树
PreCreateBiTree(&T);
printf("中序非递归遍历序列为:");
UnrecursiveInorder(T);
}
//先序创建二叉树
void PreCreateBiTree(BiTree *T){//这里必须要用二级指针,不用你操作的结果根本拿不到,你可以先用一级指针思考一下,你就会发现真的很妙,
char ch;
ch = getchar();
if (ch != '.'){
*T = (BiTNode *)malloc(sizeof(BiTNode));
(*T)->data = ch;
PreCreateBiTree(&((*T)->LChild));//这个地方要传地址而不是temp->LChild,temp->LChild是等于NULL的,你要给这个变量的地址才行
PreCreateBiTree(&((*T)->RChild));
}else{
*T = NULL;
}
}
//初始化顺序栈
Sqe InitStack(){
SqeStack *s = (SqeStack *)malloc(sizeof(SqeStack));
s->top = -1;
return s;
}
//插入数据(说入栈和压栈高级点)
int push(Sqe sqe,BiTree elem){
if (sqe->top == MAXSIZE-1){
printf("栈已满");
exit(0);
}
sqe->top++;
sqe->elem[sqe->top] = elem;
return OK;
}
//出栈或者说弹栈
int pop(Sqe s,BiTree *elem){
if (s->top == -1){
printf("栈为空");
exit(0);
}
*elem = s->elem[s->top]; //将出栈的元素返回,弹栈其实元素还在,但是不用管它,因为有元素入栈的时候,该元素就会被覆盖
s->top--;
return 1;
}
int isEmpty(struct SqeStack *s){
return s->top == -1 ? 1 : 0; //空返回1,否则,为0
}
//中序非递归遍历二叉树 使用栈 中序遍历遇到根先存储起来
void UnrecursiveInorder(BiTree T){
BiTree p = T,q;
Sqe s = InitStack();
while( !isEmpty(s) || p != NULL){//当栈为空且p指向为NULL的时候结束循环
if (p!=NULL){
push(s,p);//当前p指向的节点进栈
p = p->LChild;//继续扫描左孩子
}else{
pop(s,&q);//当前节点的父节点出栈,并且让p指向父节点的右孩子 这个地方一定要是取地址,不然你就得不到父节点
printf("%c",q->data);
p = q->RChild;
}
}
}