zoukankan      html  css  js  c++  java
  • 二叉树的非递归遍历

    二叉树的递归遍历方法形式很统一:

    void Traverse(BiTree T){

        if(T){

        //visit,先序遍历

        Traverse(T->lchild);

        //visit,中序遍历

        Traverse(T->rchild);

        //visit,后序遍历

        }

    }

    可是非递归遍历呢?前序和中序还好,跟递归的形式差不多:

    void InOrderTraverse(BiTree T, status(* visit)(TElemType e)){

        InitStack(s); p=T;

        while(p || !StackEmpty(s)){

            if(p){

            //visit,先序遍历

            Push(s,p); p=p->lchild;

            }else{

            Pop(s,p);

            //visit,中序遍历

            p=p->rchild;

            }

        }

    }

    当然前序遍历有一种优化,就是push的时候压入右孩子,然后else中直接换成Pop (s, p),节省一句代码的事,大同小异。

    然而后序呢?却无法套用上面的形式,该怎么办呢?这个的确让我想了很久,查了很多资料,都嫌繁琐和与前面形式不统一。

    最后找到了这篇博文:http://dimcutter.blog.163.com/blog/static/930932962010437590311/ 豁然开朗。

    非递归遍历二叉树的统一形式应当是这样的:

    status Traverse(BiTree T, status(* visit)(TElemType e)){

        IniTStack(s); p=T; p1=NULL;

        while(p || !StackEmpty(s)){

            if(p){

                Push(s,p);

                //visit,先序

                p=p->lchild;

            }else{

                GetTop(s,p);

                //visit,中序

                if(p->rchild==p1){

                    Pop(s,p1);p=NULL;

                    //visit,后序

                }else{

                    p=p->rchild;p1=NULL;

                }

            }

        }

    }

    走在前人走过的路上,发现前人精妙的想法,敬佩,高兴。

  • 相关阅读:
    IOS学习计划
    IOS学习计划
    Android 多线程注意事项
    Android BroadcastReceiver 的简单实现
    新书《iOS编程(第6版)》抢鲜试读
    Apple Watch 2.0 数据通讯
    iOS 9 新特性
    Apple Watch 1.0 开发介绍 2.1 WatchKit Apps UI要点
    Apple Watch 1.0 开发介绍 1.4 简介 使用iOS技术
    Apple Watch 1.0 开发介绍 1.3 简介 WatchKit App 架构
  • 原文地址:https://www.cnblogs.com/liujiahi/p/2196370.html
Copyright © 2011-2022 走看看