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;

                }

            }

        }

    }

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

  • 相关阅读:
    【应用】Linux内存调试工具:valgrind
    Python UnboundLocalError: local variable 'xxx' referenced before assignment 解决方法
    MYSQL连接时错误码2059解决办法
    Python encode()、decode()方法详解
    genymotion自动化使用
    论文数据集
    Native Apps、Web Apps和Hybrid Apps
    C# 中如何进行私有(private)函数测试
    Windows10 计划任务开始失败
    如果系统盘后面是恢复盘,如何扩充系统盘
  • 原文地址:https://www.cnblogs.com/liujiahi/p/2196370.html
Copyright © 2011-2022 走看看