关于数据结构中二叉树的中序遍历非递归算法解决思路
关于数据结构中二叉树的中序遍历非递归算法
最近做一个二叉树的中序遍历的非递归算法,但是编译通过就是运行出问题,哪位高手帮我改改错啊~~
我通过debug知道问题一定出在入栈了,因为执行完GoFarLeft(T,s)这个函数后栈的top指针并没有向下移动一个单位,所以再次入栈的时候就把原来栈中的元素覆盖了……但是实在不知道该怎么改,请帮帮忙~~~:)
------解决方案--------------------
最近做一个二叉树的中序遍历的非递归算法,但是编译通过就是运行出问题,哪位高手帮我改改错啊~~
我通过debug知道问题一定出在入栈了,因为执行完GoFarLeft(T,s)这个函数后栈的top指针并没有向下移动一个单位,所以再次入栈的时候就把原来栈中的元素覆盖了……但是实在不知道该怎么改,请帮帮忙~~~:)
- C/C++ code
#include "stdafx.h" #include "stdio.h" #include "malloc.h" #include "stdlib.h" #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 #define ERROR 0 #define STACK_INIT_SEZE 100 #define STACKINCREMENT 10 typedef struct BiTNode{ char data; struct BiTNode* lchild,*rchild; }BiTNode,*BiTree; typedef struct Stack{ BiTree* base; BiTree* top; int stacksize; }Stack; void InitStack(Stack &s){ s.base = (BiTree*)malloc(STACK_INIT_SEZE*sizeof(BiTNode)); if(!s.base) exit(OVERFLOW); s.top = s.base; s.stacksize = STACK_INIT_SEZE; } int StackEmpty(Stack s){ if(s.top == s.base) return FALSE; else return TRUE; } void Push(Stack &s,BiTree T){ *s.top = T; s.top++; } BiTree Pop(Stack &s){ BiTree e = NULL; if(s.base == s.top) return ERROR; s.top--; e = *s.top; return e; } BiTree CreaBiTree(BiTree &T){ char ch; scanf("%c",&ch); if(ch == 'x') T = NULL; else{ if(!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data = ch; CreaBiTree(T->lchild); CreaBiTree(T->rchild); } return T; } void visit(char& e){ printf("%c",e); } BiTNode* GoFarLeft(BiTree T,Stack s){ if(!T) return NULL; while(T->lchild){ Push(s,T); T = T->lchild; } return T; } void Inorder_Mid(BiTree T,Stack &s,void(*visit)(char &e)){ BiTree t = GoFarLeft(T,s); while(t){ visit(t->data); if(t->rchild) t = GoFarLeft(t->rchild,s); else { if(!StackEmpty(s)) t = Pop(s); else t = NULL; } } } int main(int argc, char* argv[]) { BiTree tree = CreaBiTree(tree); Stack s; InitStack(s); Inorder_Mid(tree,s,visit); printf("Hello World!\n"); return 0; }
------解决方案--------------------
- C/C++ code
1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; }SqStack; void PreOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { while (p!=null) //遍历左子树 { visite(p->data); push(s,p); p=p->lchild; }//endwhile if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历 { p=pop(s); p=p->rchild; }//endif }//endwhile }//PreOrderUnrec 2.中序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; }SqStack; void InOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { while (p!=null) //遍历左子树 { push(s,p); p=p->lchild; }//endwhile if (!StackEmpty(s)) { p=pop(s); visite(p->data); //访问根结点 p=p->rchild; //通过下一次循环实现右子树遍历 }//endif }//endwhile }//InOrderUnrec 3.后序遍历非递归算法 #define maxsize 100 typedef enum tagtype; typedef struct { Bitree ptr; tagtype tag; }stacknode; typedef struct { stacknode Elem[maxsize]; int top; }SqStack; void PostOrderUnrec(Bitree t) { SqStack s; stacknode x; StackInit(s); p=t; do { while (p!=null) //遍历左子树 { x.ptr = p; x.tag = L; //标记为左子树 push(s,x); p=p->lchild; } while (!StackEmpty(s) && s.Elem[s.top].tag==R) { x = pop(s); p = x.ptr; visite(p->data); //tag为R,表示右子树访问完毕,故访问根结点 } if (!StackEmpty(s)) { s.Elem[s.top].tag =R; //遍历右子树 p=s.Elem[s.top].ptr->rchild; } }while (!StackEmpty(s)); }//PostOrderUnrec ============================================================= 算法一: Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) { //采用二叉链表存储结构,Visit是对数据元素操作的应用函数。 //中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit。 InitStack(S); Push(S,T); //根指针进栈 while(!StackEmpty(s)) { while(GetTop(S,p)&&p) Push(S,p->lchild); //向左走到尽头 Pop(S,p); //空指针退栈 if(!StackEmpty(S)) //访问结点,向右一步 { Pop(S,p); if(!Visit(p->data)) return ERROR; Push(S,p->rchild); }//if }//while return OK; }//InOrderTraverse 算法一 ============================================================ ============================================================ 算法二: Status InOrderTraverse(BiTree T, Status (*Visit)(TelemType e)) { //采用二叉链表存储结构,Visit是对数据元素操作的应用函数。 //中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit。 InitStack(S); p=T; while(p||!StackEmpty(S)) { if(p) { Push(S,p); p=p->lchild; }//if 根指针进栈,遍历左子树 else { Pop(S,p); if(!Visit(p->data)) return ERROR; p=p->rchild; }//else 根指针退栈,访问根结点,遍历右子树 }//while }InOrderTraverse() 算法二 ============================================================