试写出非递归的后序遍历算法
    分析:
        非递归的后续遍历较中序和先序而言,稍微复杂一点,首先我们需要一直从根节点往下寻找左孩子并入栈,之后访问栈顶元素,
        并判断是否有右孩子,如果有右孩子入栈,并继续往左孩子找,直到某节点为单节点,出栈并访问。需要注意的是因为有可能一个节点我们
        会访问两次,所以我们设置一个指针r用来表示上一次被访问过得节点,防止又把它的右孩子再次入栈。

struct biTree {//树的结构体char data;struct biTree *lchild;struct biTree *rchild;
};
struct Stack {//栈的结构体char* arr; //内存首地址int  len;    //栈的容量int top;  //栈的下标
};
#include <stdio.h>
#include <stdlib.h>
void inOrder(biTree *T, Stack *s) {//中序遍历biTree *p = T;biTree *r = (struct biTree*)malloc(sizeof(struct biTree));bool empty(Stack *);bool pushS(Stack *, biTree *);biTree *top(Stack *);bool pop(Stack *);while (p || !empty(s)) {if (p) {//一路向左pushS(s, p);p = p->lchild;}else {p = top(s);if (p->rchild&&r!=p) {r = p;//记录父节点,之后再次遇到它时,就不在将他的右孩子压入栈p = p->rchild;}else {printf("%c ", p->data);//打印栈顶元素pop(s);//栈顶元素出栈p = NULL;//这里一定要将p设为NULL,因为p的孩子已经遍历过了,不设置为NUll的话,又会将左孩子压入栈}}}
}
int main() {int count = 0;struct biTree *T = (struct biTree *)malloc(sizeof(struct biTree));struct Stack *s = (struct Stack*)malloc(sizeof(struct Stack));biTree *create(biTree*);void nodeNum(biTree *, int *);Stack *createStack(int);T = create(T);nodeNum(T, &count);s = createStack(count);//创建二叉树节点个数大小的栈inOrder(T, s);return 0;
}

有种脾气叫,不放弃。

后序遍历(非递归)☆相关推荐

  1. 二叉树后序遍历_二叉树后序遍历非递归实现

    二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...

  2. 二叉树后序遍历(非递归)

    原文地址为: 二叉树后序遍历(非递归) 二叉树的递归遍历算法就不用说了:在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着 ...

  3. 二叉树前序、中序、后序遍历非递归写法的透彻解析

    前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...

  4. 数据结构 5-3-2 二叉树前序中序后序遍历非递归实现

    一.前言 上一篇整理了几种遍历方式的递归实现,递归的实现方法都很简单,区区几句代码就可以实现,但是如果要用非递归的方法来实现就有些挑战了. 二.中序遍历 从中序遍历开始,其实非递归的方法就是把递归变成 ...

  5. 二叉树的前序、中序、后序遍历非递归实现

    这是leetcode上的3个题目,要求用非递归实现,其中以后序遍历实现最难,既然递归实现的三种遍历程序只需要改变输入代码顺序,为什么循环不可以呢,带着这种执拗的想法,我开始了这次研究 我依然是将递归用 ...

  6. 2021 - 10 -7 ! 二叉树的前序、中序、后序遍历 非递归思路(迭代版本)

    //! 前序遍历的非递归版本,精髓在于用栈模拟递归的过程,但实际进栈出栈顺序与递归并不一样, //! 比较抽象,建议画图理解,比较重要 void BinarySearchTreesZH::preord ...

  7. 后序遍历非递归实现(转载)

    后序遍历的非递归实现是三种遍历方式中最难的一种.因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来了难题.下面介绍两种思路. 第一种思路:对于 ...

  8. 二叉树的后序遍历(递归和非递归)

    二叉树的后序遍历 后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历.后序周游,记为左右根,简记:左右根. 步骤(非递归): ⼆叉树的后序遍历顺序是左-右-根.在这里仍然采用棧来进行辅助,具体步骤如 ...

  9. 二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现

    二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现 提示:今天开始,系列二叉树的重磅基础知识和大厂高频面试题就要出炉了,咱们慢慢捋清楚! 文章目录 二叉树,二叉树的归先序遍历,中序遍历, ...

  10. 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

    前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...

最新文章

  1. 2017-2018-1 20155202 《信息安全系统设计基础》第9周学习总结
  2. 不是技术也能看懂容器技术与容器平台
  3. 【BZOJ4237】稻草人
  4. Linux 和 Windows 平台不同的 UCS-2 编码
  5. 洛谷P4219 大融合(LCT、虚子树)
  6. LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)
  7. 隐藏右侧“快速启动栏”中的回收站图标及查看所有网站内容
  8. 在Simulink中设计多工位的系列PID控制器Design Family of PID Controllers for Multiple Operating Points
  9. 为什么发音要浊化(sp、st、sk)
  10. 电信移动信号测试软件,移动、联通、电信(信号强度大比拼)
  11. 免Flash文件上传 (Upload without Flash)
  12. python远程主机强迫关闭了_[转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054...
  13. Java:XML之JavaSE SAX解析
  14. STM32彩灯控制器
  15. 直播预告 | ICLR专场二
  16. 【Winform】单元格的Formatted值的类型错误
  17. 从nginx“惊群”问题来看高并发锁的方案
  18. 【Swoole】当SWOOLE遇上PHP
  19. Word打开报错:安全模式 恢复数据
  20. 软件设计师学习笔记-计算机组成笔记

热门文章

  1. 3D开发-AR技术基础
  2. 权限管理系统如何分别实现对用户和角色的授权
  3. 六步实现Spring.NET 与 NHibernate 的整合
  4. 拍照购物APP之可行性分析
  5. 2014/09/30 Learning Note
  6. vue路由参数改变,组件数据没重新更新问题
  7. JavaScript学习笔记之BOM篇,认识几种常见的浏览器对象
  8. JavaScript算法(实例一)完数 / 水仙花数 / 素数
  9. Tips--解决安装完Anaconda没有快捷方式的问题
  10. ipc$远程连接计算机的指令,通过IPC$***,通过命令开启远程协助,。。