递归形式

递归形式遍历比较简单,不做详细论述。
前序遍历

void  Preorder(treenode* root)   //前序
{if (root != NULL){printf("%c", root->data);Preorder(root->left);Preorder(root->right);}

中序遍历

}
void  Inorder(treenode* root)    //中序
{if (root != NULL){    Inorder(root->left);printf("%c", root->data);Inorder(root->right);}}

后序遍历

void  Postorder(treenode* root)     //后序
{if (root != NULL){Postorder(root->left);Postorder(root->right);printf("%c", root->data);}
}

非递归形式

前序遍历
开始不断向左孩子遍历并入栈,在入栈的同时打印节点数据,直到左孩子为空,此时获取栈顶节点,并将其出栈,判断其有无右孩子,如果无右孩子,就再次获取栈顶节点并出栈,重复上述操作;如果有右孩子就将其入栈,并不断遍历其左孩子直到为空,重复上述操作,直到栈为空。

void PreOrder(treenode* root)
{if (root == NULL)return;treenode* p = root;stack<treenode *> s;while (!s.empty() || p){//边遍历边打印,并存入栈中while (p){printf("%c ", p->data);s.push(p);p = p->left;}//当p为空时,说明根和左子树都遍历完了,进入右子树if (!s.empty()){p = s.top();s.pop();p = p->right;}}
}

中序遍历
从根节点开始不断向左孩子遍历并入栈,直到为空,只要没有左孩子就出栈,在出栈的同时就打印节点数据,此时在判断出栈节点是否有右孩子,如果有右孩子重复上述操作继续向左孩子遍历,如果没有就出栈,重复上述操作判断有无右孩子,直到栈为空就退出遍历。

void InOrder(treenode* root)
{//空树if (root == NULL)return;//树非空treenode* p = root;stack<treenode *> s;while (!s.empty() || p){//一直遍历到左子树最下边,边遍历边保存根节点到栈中while (p){s.push(p);p = p->left;}//当p为空时,说明已经到达左子树最下边,这时需要出栈了if (!s.empty()){p = s.top();s.pop();printf("%c ", p->data);//进入右子树p = p->right;}}
}

后序遍历
后续在理解上较为难,用两个栈s1,s2更为直观,便于理解。
首先将根节点放入s2,再将其左右孩子放入s1中,一定要先放入左孩子,再放入右孩子,此时在获取s1栈顶节点并出栈,判断其是否有左右孩子,只要有孩子就将该节点入栈s2,并将该节点左右孩子放入s1中;如果该节点无左右孩子那么直接出栈s2并入栈s1,重复上述操作直到s1为空,在将s2从栈顶打印到栈底便是后续遍历

void PostOrder(treenode *root)
{stack<treenode *>s1, s2;treenode *cur=root; s1.push(cur);//入栈根节点while (!s1.empty()){cur = s1.top();//出栈s1入栈s2s1.pop();s2.push(cur);//判断是否有左右孩子,有则入栈s1if (cur->left)s1.push(cur->left);if (cur->right)s1.push(cur->right);}while (!s2.empty()){printf("%c ", s2.top()->data);//打印s2s2.pop();}
}

层序遍历
层序遍历需要用到队列,先入队根节点,在出队,将其左右孩子入队,依次出队入队操作,只要该节点有孩子就入队,再出队的同时打印节点数据

void sequence(treenode *root)
{deque<treenode *>q;treenode *cur = root;q.push_back(cur);//根节点入队while (!q.empty()){cur = q.front();//获取队头q.pop_front();printf("%c ", cur->data);//孩子入队if (cur->left)q.push_back(cur->left);if (cur->right)q.push_back(cur->right);}
}

二叉树的前序、中序、后续、层序遍历(包含递归与非递归)相关推荐

  1. 二叉树的前序,中序,后续(非递归版本)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.前序 二.后序 三.中序 总结 前言 二叉树的非递归版本的前序中序后序在面试中也经常考,必须熟练掌握! 下面将会讲 ...

  2. python数据结构二叉树的前序,中序,后续遍历与推导

    根据先序中序求后续 其余同理,多画图就理解了

  3. 二叉树的前序中序后序遍历

    二叉树的前序中序后序遍历 二叉树的遍历 前序遍历 中序遍历 后序遍历 总结 二叉树的遍历 二叉树的遍历有前序遍历,中序遍历,后序遍历三种. 今天我把二叉树的遍历方法给大家总结一下,也算对我自己学习的一 ...

  4. 栈的亚特兰数与二叉树的前序中序遍历序列

    栈的亚特兰数与二叉树的前序中序遍历 @(算法学习) 已经熟知的是二叉树的中序遍历和先序遍历可以唯一确定一棵树. 更有趣的知识点是,以先序遍历序列作为入栈序列,那么出栈序列恰为中序遍历.这样就把两种遍历 ...

  5. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  6. 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...

    后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...

  7. 二叉树的前序中序后序遍历java代码实现

    1.前序遍历概述 前序遍历(VLR) 是二叉树遍历的一种,也叫做先根遍历.先序遍历.前序周游,可记做根左右.前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1 ...

  8. 二叉树的前序中序后序三种遍历方式及递归算法介绍

    二叉树三种遍历方式 二叉树的遍历是整个二叉树的核心,二叉树的几本操作都要依赖于遍历,对于二叉树的遍历,递归是最简单也最容易理解的,本文详细介绍了二叉树的三种遍历方法,并用递归来实现: 完整的可调试代码 ...

  9. C/C++面试题—重建二叉树【前序 + 中序- 重建二叉树 和 后序 + 中序 - 重建二叉树】

    题目介绍 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{ ...

  10. 已知前序中序求层序 c语言递归,二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现...

    # re: 二叉树的遍历:前序,中序输出有点问题,但是不知道到怎么修改,想请教各位大神  回复  更多评论 #include"stdio.h" #include"mall ...

最新文章

  1. 不看你都不知道,原来码农的诞生这么不容易
  2. 深入理解JVM—性能监控工具
  3. 2017软件工程实践第二次作业
  4. Android线程机制——AsyncTask
  5. C语言 strnlen函数实现
  6. 前端:HTML5/36/HTML5简介,文档类型定义,网页字符集,页面结构标记,文章相关的标记,其它标记,音频标记,视频标记,表单中新增的属性,表单input元素type属性的值
  7. Nginx 基于nginx-sticky-module模块进行会话保持
  8. 关于Eclipse中各个文件(*.java *.jsp *.xml)文字大小的设定。
  9. Python-S9-Day123——爬虫两示例
  10. python语句分号_Python中的分号
  11. mysql 备份库的shell_shell脚本之 备份mysql数据库
  12. WindowsMobile6之“HTC Touch” - iphone的强大竞争对手
  13. 并行机台模型Parallel Machine Models (Deterministic)-LPT算法实现
  14. 计算机专业研究生阶段有几大研究方向可以选择
  15. ColorOS 13流畅吗?看OPPO在系统上做了哪些升级?
  16. 批量将MP3或者m4a转为wav格式
  17. 声源近场与远场定位及方法
  18. 基于MATLAB金属表面缺陷分类与测量的GUI设计
  19. YTU 问题 : 数组奇偶操作
  20. Excel之利用Excel的排序功能可以让表格整体按照某一列降序排列而排列(一)

热门文章

  1. 13-容器的端口映射
  2. 问题 A: 深度学习
  3. 08-spring学习-annotation配置
  4. HNUSTOJ-1437 无题
  5. nginx(五)rewrite
  6. 黑五已火 电商跨境成燎原之势
  7. DB2中admin_cmd执行load
  8. python直接连接oracle_python连接oracle
  9. vs设计窗口不见了_碳纤维的巅峰:VS沛纳海616V3
  10. Mybatis源码阅读(二):动态节点解析2.2 —— SqlSourceBuilder与三种SqlSource