首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于数据结构中二叉树的中序遍历非递归算法解决思路

2012-02-29 
关于数据结构中二叉树的中序遍历非递归算法最近做一个二叉树的中序遍历的非递归算法,但是编译通过就是运行

关于数据结构中二叉树的中序遍历非递归算法
最近做一个二叉树的中序遍历的非递归算法,但是编译通过就是运行出问题,哪位高手帮我改改错啊~~
我通过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 100typedef 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 100typedef 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 100typedef 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() 算法二 ============================================================ 

热点排行