前序非递归遍历(借用栈结构):
①将根节点入栈;
②判栈空,获取栈顶元素输出;
③判断右子树是否为空,再判断左子树是否为空,在回至②执行。
void PreOrder(BinTree bt)
{stack<BinTree> astack;BinTreeNode * p;astack.push(bt);while(!astack.empty()){p=astack.top();astack.pop();cout<<p->data<<" ";if(p->rightchild!=NULL){astack.push(p->rightchild);}if(p->leftchild!=NULL){astack.push(p->leftchild);}}
}

中序非递归遍历(借用栈结构):
先将根节点入栈
①首先保存当前结点所有的左树结点;
②当左树为空时,获取栈顶元素(最左子树)输出val;
③再访问栈顶元素的右子树(p=p->right),再回退到①。
void InOrder(BinTree bt)
{stack<BinTree> astack;BinTree p;p=bt;if(p==NULL){return;}astack.push(bt);p=p->leftchild;while(p||!astack.empty()){while(p!=NULL)//沿着左支深入直至NULL
        {astack.push(p);p=p->leftchild;}p=astack.top();//逐个弹出,访问
        astack.pop();cout<<p->data<<" "; p=p->rightchild;//进入右支,下次的大循环,就在右支中向左深入
    }
}

后序非递归遍历(借用栈结构):
①判断当前结点不为空,并且栈不空,然后将根节点左子树所有节点压栈。
②获取栈顶元素并pop(),判断一下此时的栈顶元素的左子树,是否是上一次pop出的元素(即“/”型,表示当前栈顶元素的右子树还未遍历,故又以当前栈顶元素的右子树作为根节点),继续执行①;若不满足,则将其至NULL。
void PostOrder(BinTree bt)
{BinTree p=bt;stack<BinTree> astack;if(bt==NULL){return ;}while(p!=NULL||!astack.empty()){while(p!=NULL){astack.push(p);p=p->leftchild?p->leftchild:p->rightchild;//如果左孩子非空,移向左孩子,否则移向右孩子
        }//此处已到达最底层 p=astack.top();astack.pop();cout<<p->data<<" ";if(!astack.empty()&&(astack.top()->leftchild==p))//如果栈非空,并且刚刚访问的节点是左孩子
        {p=astack.top()->rightchild;//移向右孩子,下次大循环就开始寻找这个节点最底层
        }else//如果是右孩子,说明左孩子在上次就被处理
        {p=NULL;//p赋为空,这样下次大循环中的第一个循环被掠过,相当于返回了上一层
        }}
}

转载于:https://www.cnblogs.com/single-dont/p/11545226.html

二叉树的遍历(非递归方式)相关推荐

  1. 二叉树后续遍历非递归

    二叉树的后序非递归遍历就比较难写,因为涉及到判断节点的访问状态- 现在有个很巧妙的方法: 前序:根->左->右 后序:左->右->根 那么可以把后序当作:根->右-> ...

  2. 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char DataType; #de ...

  3. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)

    分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...

  4. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  5. 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)

    本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...

  6. golang二叉树的递归和非递归方式的前中后序遍历

    二叉树的递归和非递归方式中序遍历 方法一:递归 思路与算法 首先我们需要了解什么是二叉树的中序遍历:按照访问左子树--根节点--右子树的方式遍历这棵树() (前序和后序遍历方式一样,就是打印root节 ...

  7. 对于二叉树三种非递归遍历方式的理解

    利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...

  8. 二叉树的遍历 (递归和非递归实现)

    二叉树的遍历 (递归实现) 用C++实现二叉树的"先根遍历"存储. 用C++实现二叉树的"先根遍历"."中根遍历"."后根遍历&q ...

  9. 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法

    引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...

  10. 二叉树的遍历(递归与非递归实现)

    二叉树的遍历(递归与非递归实现) 二叉树的实现(三叉链表的形式) public class XieChaoThreeLinkBinTree<E> {public static class ...

最新文章

  1. 2022-2028年中国机制砂石行业投资分析及前景预测报告
  2. 皮一皮:直男最后的倔强...
  3. python可以做什么开发-Python能做什么,能够开发什么项目?
  4. Dockerfile构建PHP镜像
  5. 如何计算近似纳什均衡_明明合作可以“共赢”,为什么他会损人不利己?博弈论之纳什均衡...
  6. boost::mpl模块实现sort相关的测试程序
  7. OpenShift 4 之Istio-Tutorial (11) 控制Egress访问
  8. MD4哈希算法原理及实现(附源码)
  9. android输入法ios下载安装,仿ios输入法
  10. Java进阶诀窍httpwww.china-pub.com44147
  11. 谈谈网络通信中的 ACK、NACK 和 REX
  12. 为什么大多数人永远不会真正成功?
  13. 百度地图的一些踩坑 marker网络图片不显示
  14. 2022-2027年中国酸性蛋白酶行业发展前景及投资战略咨询报告
  15. Windows 10 IDM 下载play.kth.se上面的网课视频
  16. 康奈尔本科学计算机要什么条件,康奈尔大学计算机专业申请条件详细解读
  17. 【硬盘】2021-西部数据叠瓦盘(SMR)、垂直盘(CMR/PMR)型号、容量大全
  18. 小米电视不同清晰度图片对比效果
  19. 用Vue+Node从零开始实现拼多多前后端商城项目 — 记录踩坑之旅(上篇)
  20. Python读书笔记第五章:运算符与表达式

热门文章

  1. php判断当前时间是否跨月,判断日期是否能跨月查询的js代码_javascript技巧
  2. java打星星_java实现星星图形的输出
  3. jwt token注销_辩证的眼光搞懂 JWT 这个知识点
  4. php descryptoserviceprovider,在unity3D上对数据进行DES加密,在PHP服务器上进行解密的详细教程...
  5. 对某bc站的一次渗透测试
  6. 阿里云服务器的安装以及使用
  7. ReactNative(API)Alert
  8. Android adb.exe程序启动不起来,如何处理
  9. 第16课:动手实战中文句法依存分析
  10. Python3中的 Filter的改变