首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归)

这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远!

折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点。都比较麻烦没有调试成功。若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况。从借鉴的博文里,摘录并改写为C的代码,基本上没有改动。后续问题努力写出自己的原创代码。

二叉树存储的数据类型为int型,用数字0表示子树为空

输入:1 2 3 0 8 0 0 4 0 0 5 6 0 0 7 0 0

得到后序遍历结果:83426751

 #include <stdio.h>
 #include <stdlib.h>

 #define OK              1
 #define ERROR           0
 #define MaxSize         100 

 typedef int ElemType;
 typedef int Status;

 typedef struct BTNode{
     ElemType    data;
     struct BTNode *lchild,*rchild;
 }BTree;

 typedef struct St{
     struct BTNode*    data[MaxSize];
     int               top;
 }Stack;
 //1.按先序次序生成二叉树
 BTree* CreateT(){
     BTree *BT;
     ElemType ch;
     scanf("%d",&ch);
     )
         BT=NULL;
     else{
         BT=(BTree*)malloc(sizeof(BTree));
         if(!BT){exit(OVERFLOW);}
         BT->data=ch;
         BT->lchild=CreateT();
         BT->rchild=CreateT();
     }
     return BT;
 } 

 //4.后序遍历
 Status PostOrder(BTree *BT) {
     if(BT){
         PostOrder(BT->lchild);
         PostOrder(BT->rchild);
         printf("%3d",BT->data);
         return OK;
     }
     else return ERROR;
 }
 //4.后序遍历-非递归
 Status PostOrder2(BTree *BT) {
     Stack s,s2;
     BTree *T;
     int flag[MaxSize];
     s.top=;
     T=BT;
     ||T){
         while(T)
         {
             s.data[s.top++]=T;
             flag[s.top-]=;
             T=T->lchild;
          }
          &&flag[s.top-]==){
              T=s.data[--s.top];
              printf("%3d",T->data);
          }
          ){
              flag[s.top-]=;
              T=s.data[s.top-];
              T=T->rchild;
          }
          else   break;
     }
     return OK;
 }
 int main(){
     BTree *BT;
     BT=CreateT();
     if(PostOrder(BT)){
         printf("\n后序遍历完成!\n");
     }
     if(PostOrder2(BT)){
         printf("\n非递归后序遍历完成!\n");
     }
 }

//-------------------------华丽的分割线-------------------------------------

下面是我自己写的后序遍历程序

 //非递归后序遍历-test
 void PostOrder3(BTree *T){
     BTree *p=T;Stack s;s.top=-;
     int tag[MaxSize];
     ){

         if(p){
             s.data[++s.top]=p;
             tag[s.top]=;
             p=p->lchild;
         }
         else{
             ){
             p=s.data[s.top--];
             printf("%d",p->data);
             }
             p=s.data[s.top];
             p=p->rchild;
             tag[s.top]=;
         }
         ) break;
     }
 } 

二叉树后序遍历的非递归算法(C语言)的更多相关文章

  1. BFS、DFS、先序、中序、后序遍历的非递归算法(java)

    一 广度优先遍历(BFS) //广度优先遍历二叉树,借助队列,queue public static void bfs(TreeNode root){ Queue<TreeNode> qu ...

  2. 前序 中序 后序 遍历 递归 非递归算法 java实现

    前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...

  3. Java实现二叉树的前序、中序、后序遍历(非递归方法)

      在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...

  4. LeetCode 145 二叉树的后序遍历(非递归)

    题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1 ...

  5. LeetCode:145_Binary Tree Postorder Traversal | 二叉树后序遍历 | Hard

    题目:Binary Tree Postorder Traversal 二叉树的后序遍历,题目要求是采用非递归的方式,这个在上数据结构的课时已经很清楚了,二叉树的非递归遍历不管采用何种方式,都需要用到栈 ...

  6. [Leetcode] Binary tree postorder traversal二叉树后序遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  7. lintcode.68 二叉树后序遍历

    二叉树的后序遍历    描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的后序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返 ...

  8. 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...

  9. 数据结构实验之求二叉树后序遍历和层次遍历(SDUT 2137)

    Problem Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据. ...

随机推荐

  1. seq2sparse(4)之PartialVectorMergeReducer源码分析

    继前篇blogseq2sparse(3)之TFParitialVectorReducer源码分析 之后,继续分析下面的代码,本次分析的是PartialVectorMergeReducer的源码,这个r ...

  2. 错误处理:java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEachTag

    在使用JSP.Servlet进行开发时,遇到java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEac ...

  3. 【经典面试题】实现平方根函数sqrt

    本文将从一道经典的面试题说起:实现平方根函数,不得调用其它库函数. 函数原型声明例如以下: double Sqrt(double A); 二分法 二分法的概念 求,等价于求方程的非负根(解).求解方程 ...

  4. MySQL(11):存储引擎

    1.存储引擎是什么?       MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择 ...

  5. Ubuntu 修改时区和时间

    tzselect #根据提示选择时区 sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #把设置好的时区文件粘贴到 /etc/local ...

  6. activiti_SpringEnvironment

    package main; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; i ...

  7. Example_07_05录音提示open failed: EACCES (Permission denied)

    在AndroidManifest.xml文件中加入下面这句话:<uses-permission android:name="android.permission.WRITE_EXTER ...

  8. MVC接收以post形式传输的各种参数

    近日研究用wcf框架接收同事Android端以post形式传输的各种类型的参数,来做处理.但研究过程中问题比较多,首先键值对的形式是实现了,传输int,string类型都不成问题,但是到传输文件的时候 ...

  9. 在SPItemEventReceiver中使用BeforeProperties和AfterProperties

    当你利用这些事件时,就很快会发现存在前(同步)后(异步)两种事件.其方法的后缀分别为“ing”(比如,ItemAdding)和“ed”(比如,ItemAdded),分别代表了变更发生前调用和发生后调用 ...

  10. Asp.Net WebAPI 中Cookie 获取操作方式

    1. /// <summary> /// 获取上下文中的cookie /// </summary> /// <returns></returns> [H ...