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;

                }

            }

        }

    }

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

  • 相关阅读:
    Nodejs接收图片base64格式保存为文件
    tracking.js实现前端人脸识别
    node.js执行shell命令进行服务器重启
    Cordova 实现沉浸式(透明)状态栏效果
    SpringBoot启动原理详解
    连续子数组的最大乘积及连续子数组的最大和(Java)
    记录面试遇到的几个自己不太熟悉的问题(3)
    记录面试遇到的几个自己不太熟悉的问题(2)
    记录面试遇到的几个自己不太熟悉的问题(1)
    Java设计模式
  • 原文地址:https://www.cnblogs.com/liujiahi/p/2196370.html
Copyright © 2011-2022 走看看