二叉树深度优先遍历(非递归)

1. 先序遍历非递归化

  • 从根结点开始入栈一个元素
  • 不停的执行以下操作:
    • 如果栈不空,就出栈一个元素,并对其进行访问,并访问其左右孩子
    • 若左右孩子存在,则依次入栈,右孩子先入栈,左孩子后入栈
    • 若没有左右孩子则继续出栈一个元素
  • 如果进行出栈操作后栈为空,表明遍历结束
typedef struct BTNode
{int data;struct BTNode* lChild;        //指向其左孩子的指针struct BTNode* rChild;       //指向其右孩子的指针
}BTNode;
//参数列表为根结点的指针
void preorder(BTNode *bt)
{//首先判断根结点是否为空if (bt != NULL){//建立一个栈BTNode *Stack[maxSize];int top = -1;BTNode *p = NULL;Stack[++top] = bt;while (top != -1){//先出栈一个元素,并对其进行访问p = Stack[top--];Visit(p);//监测其左右孩子是否存在//如果存在则入栈//先入栈右孩子,再入栈左孩子if (p->rChild != NULL)Stack[++top] = p->rChild;if (p->lChild != NULL)Stack[++top] = p->lChild;}}
}

2. 后序遍历非递归化

  • 先序遍历:先访问根结点,然后先遍历左子树,最后遍历右子树

  • 后序遍历:先后序遍历左子树,然后后续遍历右子树,最后访问根结点

  • 逆后续遍历序列:先遍历根,再遍历右子树,最后遍历左子树

//后序遍历序列
typedef struct BTNode
{int data;struct BTNode* lChild;        //指向其左孩子的指针struct BTNode* rChild;       //指向其右孩子的指针
}BTNode;
//参数列表为根结点的指针
void preorder2(BTNode *bt)
{//首先判断根结点是否为空if (bt != NULL){//建立两个栈,一个是辅助栈,一个是将结果序列逆序的栈BTNode *Stack1[maxSize];int top1 = -1;BTNode *Stack2[maxSize];int top2 = -1;BTNode *p = NULL;Stack1[++top1] = bt;while (top1 != -1){//先出栈一个元素,并对其进行访问p = Stack1[top1--];Stack2[++top2] = p;Visit(p);//监测其左右孩子是否存在//如果存在则入栈//先入栈左孩子,再入栈右孩子if (p->lChild != NULL)Stack1[++top1] = p->lChild;if (p->rChild != NULL)Stack1[++top1] = p->rChild;}while (top2 != -1){p = Stack2[top2--];Visit(p);}}
}

3. 中序遍历非递归化

  • 中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树

  • 从根结点开始入栈一个元素

  • 从根结点开始访问其左分支,边访问边将其历经的结点入栈

  • 直到不能继续向左走为止,此时出栈一个结点,并访问

  • 从这个结点开始,先往右访问一次,然后继续上述操作

//后序遍历
void ino(BTNode *bt)
{if (bt != NULL){BTNode *Stack[maxSize];int top = -1;BTNode *p = NULL;p = bt;while (top != -1||p!=NULL)   //执行完if语句以后可能栈空,但如果p的右子树存在,即p!=NULL(执行完if语句后p = p->rChild),还应该继续遍历{while (p != NULL){Stack[++top] = p;p = p->lChild;}if (top != -1){p = Stack[top--];Visit(p);p = p->rChild;}}}
}

二叉树深度优先遍历(非递归)相关推荐

  1. 无向图的深度优先遍历非递归_LeetCode0429: N叉树的层序遍历

    题目介绍 描述: 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历:[[1],[3,2,4],[5,6] ]说明:树的深度不会超过 ...

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

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

  3. 无向图的深度优先遍历非递归_【数据结构图(一)】什么是图

    一.什么是"图"(Graph) 表示"多对多"的关系 包含 一组顶点:通常用 V (Vertex) 表示顶点集合 一组边:通常用 E (Edge) 表示边的集合 ...

  4. 无向图的深度优先遍历非递归_LeetCode133-克隆图(附详细测试用例构建方法)

    今天最最最开心激动的一件事 就是自己的论文终于出版了 虽然是一篇口碑不好的文章 但还是有些激动啊 千里之行始于足下 希望自己有个好的前景 题目描述: 给你无向 连通 图中一个节点的引用,请你返回该图的 ...

  5. 无向图的深度优先遍历非递归_图算法总结

    @[TOC] 图算法 1.图的表示 1.1.邻接矩阵(有向图.无向图.带权图.代码实现) 1.无向图的邻接矩阵 2.有向图的邻接矩阵 3.带权值的图 有了上述的理解,我们可以设计数据结构,并实现了. ...

  6. 二叉树深度优先遍历-递归实现

    二叉树深度优先遍历的递归实现 一.深度优先遍历 二.先序遍历 1.算法思路 2.代码实现 三.中序遍历 1.算法思路 2.代码实现 四.后序遍历 1.算法思路 2.代码实现 一.深度优先遍历 对每一个 ...

  7. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

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

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

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

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

最新文章

  1. Python 操作redis
  2. ios开发 UITableView with xib 以及自定义TableViewCell
  3. linux下直接清空日志的方法
  4. CCF NOI1004 填充矩形
  5. Trie图的学习过程
  6. 非模式对话框CreateDialog() 与 模式对话框 DialogBoxParam()和...
  7. 【爱思考】CISP考试试题介绍(其中一部分)
  8. [高通SDM450][Android9.0]禁止电话、短信呼入
  9. salt内置执行模块列表
  10. Dubbo host配置映射内网IP导致消费者无法连接到生产者提供的服务详解
  11. Opensource.com的领导层和社区是什么样的
  12. ttl mysql_TTL 生存时间
  13. 战网服务器修改,怎么修改战网客户端?修改战网客户端的方法
  14. 云数据中心与传统数据中心
  15. 混合策略改进的蝴蝶优化算法-附代码
  16. 傅里叶变换以及离散傅里叶变换
  17. 彩虹显IP 后两位星号 解决方案 全显IP
  18. 基于Android+SpringBoot+MySQL的外卖APP系统设计与实现
  19. html怎么把一段文字设置为连接到下一个网页的按钮,为主页添加一个漂亮的按钮(上)_html...
  20. 反向延长线段什么意思_关于线段的延长线的概念教学反思

热门文章

  1. js---BOM 的理解方法
  2. 2021年危险化学品经营单位安全管理人员考试资料及危险化学品经营单位安全管理人员考试总结
  3. 奶粉中php是什么意思,奶粉中脱脂牛奶和脱脂乳粉的区别
  4. 【基础数学--埃氏筛】204. 计数质数
  5. 欧拉角pitch、yaw,roll的理解
  6. 意法半导体STM32MP157A MPU加持,米尔科技首款ST Linux开发板MYD-YA157C评测
  7. android usb存储模式,Android USB连接说明:MTP,PTP和USB大容量存储器
  8. eclipse下搭建Vaadin工程
  9. 低代码开发AI行业应用前端UI,全景低代码开发
  10. 从YOLOv1到v3的进化之路