• 二叉树3种遍历的非递归算法


    http://blog.csdn.net/pipisorry/article/details/37353037
    c实现:
    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 {L,R} 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

    c++实现:

    ref:http://siwei1987.blog.51cto.com/430256/118551

    from:http://blog.csdn.net/pipisorry/article/details/37353037

    版权声明:这篇文章的博客http://blog.csdn.net/pipisorry原创文章,博客,未经同意不得转载。

  • 相关阅读:
    【并发编程】多线程并发最佳实践
    【并发编程】死锁
    【并发编程】【JDK源码】J.U.C--线程池
    【并发编程】【JDK源码】J.U.C--组件FutureTask、ForkJoin、BlockingQueue
    【JVM】关于类加载器准备阶段的一道面试题目
    【并发编程】【JDK源码】J.U.C--AQS 及其同步组件(2/2)
    【并发编程】线程安全策略
    JSP 9大内置对象详解
    Jquery中的bind(),live(),delegate(),on()绑定事件方式
    阻止事件冒泡
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4808124.html
Copyright © 2020-2023  润新知