二叉树的非递归遍历C语言实现
腾讯面试中被问到二叉树的非递归遍历实现,当时记得不太清楚,回来专门复习了非递归的实现,整理代码如下:
//采用二叉链表存储方式的二叉树,非递归中序遍历C语言实现代码 #include<stdio.h> #include <malloc.h> //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //Status是函数的类型,其值是函数结果状态代码 typedef int Status; #define STACK_INIT_SIZE 10 #define STACKINCREMENT 2 typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef struct{ BiTree *base; BiTree *top; int stacksize; }SqStack; Status InitStack(SqStack *S) { /* 构造一个空栈S */ (*S).base = (BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree)); if(!(*S).base) exit(OVERFLOW); /* 存储分配失败 */ (*S).top = (*S).base; (*S).stacksize = STACK_INIT_SIZE; return OK; } Status StackEmpty(SqStack S) { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ if(S.top==S.base) return TRUE; else return FALSE; } int StackLength(SqStack S) { /* 返回S的元素个数,即栈的长度 */ return S.top-S.base; } Status GetTop(SqStack S,BiTree *e) { /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */ if(S.top>S.base) { *e = *(S.top-1); return OK; } else return ERROR; } Status Push(SqStack *S,BiTree e) { if((*S).top-(*S).base>=(*S).stacksize)/*栈满,追加存储空间*/ { (*S).base = (BiTree *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(BiTree)); if(!(*S).base) exit(OVERFLOW); (*S).top = (*S).base + (*S).stacksize; (*S).stacksize += STACKINCREMENT; } *((*S).top)++=e; return OK; } Status Pop(SqStack *S,BiTree *e) { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */ if((*S).top==(*S).base) return ERROR; *e=*--(*S).top; return OK; } /*按前序输入二叉树中结点的值*/ /*#表示空树,构造二叉链表表示二叉树T*/ void CreateBiTree(BiTree *T) //输入前序序列1,2,3方法为1 2 0 0 3 0 0 { int data; scanf("%d",&data); if(data == 0) *T = NULL; else { *T = (BiTree)malloc(sizeof(BiTNode)); if(!*T) exit(OVERFLOW); (*T)->data = data; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } Status Visit(int e) { printf("%d ",e); return OK; } //中序非弟归遍历二叉树(二叉链表存储) Status InOrderTraverse(BiTree T,Status (*Visit)(int)){ SqStack S; BiTree p = T; InitStack(&S); while(p || !StackEmpty(S)){ if(p){ Push(&S,p); p = p->lchild; } else { Pop(&S,&p); if(!Visit(p->data)) return ERROR; p = p->rchild; } } return OK; } void main() { BiTree T; CreateBiTree(&T); InOrderTraverse(T,Visit); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。