二叉树实体定义:

/*** Author: Heynchy* Date:   2019/6/24* <p>* Introduce: 二叉树的定义*/
public class TreeNode implements Serializable {private  TreeNode left;    // 左子树private  TreeNode right;   // 右子树private  String value;        // 值public TreeNode(String value){this.value = value;}public TreeNode getLeft() {return left;}public void setLeft(TreeNode left) {this.left = left;}public TreeNode getRight() {return right;}public void setRight(TreeNode right) {this.right = right;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}

二叉树的初始化:

    /*** --------------二叉树--------* <p>*         1*      /     \*    2         3*  /   \     /   \* 4    5    6     7*/private void initTreeNodes() {mRoot = new TreeNode("1");TreeNode secondNode = new TreeNode("2");TreeNode thirdNode = new TreeNode("3");TreeNode forthNode = new TreeNode("4");TreeNode fifthNode = new TreeNode("5");TreeNode sixNode = new TreeNode("6");TreeNode sevenNode = new TreeNode("7");mRoot.setLeft(secondNode);mRoot.setRight(thirdNode);secondNode.setLeft(forthNode);secondNode.setRight(fifthNode);thirdNode.setLeft(sixNode);thirdNode.setRight(sevenNode);}

前序遍历(DLR)--非递归实现

    /*** 前序遍历---非递归方式* <p>* 1 2 4 5 3 6 7* 先访问根节点, 再遍历左子树, 最后遍历右子树** @param treeNode*/private void printDLR2(TreeNode treeNode) {// 使用栈进行二叉树的遍历Stack<TreeNode> stacks = new Stack<>();// 如果栈不为空 或者 根节点不为空while (!stacks.empty() || treeNode != null) {// 根据当前节点遍历左子树(并将各个节点压栈以便后续遍历右子树)while (treeNode != null) {// 输出值Log.i("HEYN1234", "treeNode===" + treeNode.getValue());// 入栈stacks.push(treeNode);// 遍历左子树treeNode = treeNode.getLeft();}// 弹栈并给出节点的右节点if (!stacks.empty()) {treeNode = stacks.pop();treeNode = treeNode.getRight();}}}

中序遍历(LDR)--非递归实现

    /*** 中序遍历--非递归实现* 4 2 5 1 6 3 7* 先遍历左子树,再访问根节点, 最后遍历右子树** @param treeNode*/private void printLDR2(TreeNode treeNode) {// 使用栈进行二叉树的遍历Stack<TreeNode> stacks = new Stack<>();// 如果栈不为空 或者 根节点不为空while (!stacks.empty() || treeNode != null) {// 根据当前节点遍历左子树(并将各个节点压栈以便后续遍历右子树)while (treeNode != null) {// 入栈stacks.push(treeNode);// 遍历左子树treeNode = treeNode.getLeft();}// 弹栈并给出节点的右节点if (!stacks.empty()) {treeNode = stacks.pop();// 输出值Log.i("HEYN1234", "treeNode===" + treeNode.getValue());treeNode = treeNode.getRight();}}}

后序遍历(LRD)--非递归实现

   /*** 后序遍历* 4 5 2 6 7 3 1* 先遍历左子树, 然后遍历右子树, 最后访问根节点,** @param treeNode*/private void printLRD3(TreeNode treeNode) {// 使用栈进行二叉树的遍历Stack<TreeNode> stacks = new Stack<>();TreeNode lastNode = null;// 如果栈不为空 或者 根节点不为空while (!stacks.empty() || treeNode != null) {// 根据当前节点遍历左子树(并将各个节点压栈以便后续遍历右子树)while (treeNode != null) {// 入栈stacks.push(treeNode);// 遍历左子树treeNode = treeNode.getLeft();}while (!stacks.empty()) {// 此处第一次进入即为最左的节点(4)TreeNode node = stacks.pop();if (node.getRight() == null || lastNode == node.getRight()) {// 如果该节点没有右子树或者右子树已经遍历过就输出对应的值Log.i("HEYN1234", "treeNode===" + node.getValue());// 将输出值的节点定义为上一个遍历的节点lastNode = node;} else {// 如果该节点有右子树并且没有遍历过则对该右子树进行处理// 因为当前出栈的节点node,因为他有右子树且没有遍历,// 所以重新将该节点压入栈,防止数据丢失stacks.push(node);// 将其右子树作为根节点进行遍历treeNode = node.getRight();// 跳出当前循环break;}}}}

面试题 7 :二叉树遍历-前序遍历(DLR),中序遍历(LDR),后序遍历(LRD)-Android端非递归实现相关推荐

  1. 【二叉树前/先序DLR中序LDR后序LRD遍历及镜像翻转,so esay~】

    二叉树前/先序DLR中序LDR后序LRD遍历及镜像翻转 一.名词释义 二叉树的遍历方式,根据遍历根节点的顺序不同,分为三种:前序(先序)遍历(DLR).中序遍历(LDR).后序遍历(LRD). 1.前 ...

  2. 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

    下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...

  3. 由前序序列与中序序列实现后序遍历

    二叉树是一种特殊的树,二叉树只有两个分支,分别是该节点的左儿子和右儿子. 前序遍历:就是先遍历根节点,然后再访问左子树与右子树.遍历子树的时候同样也是先遍历根节点然后在遍历他的左子树与右子树. 中序遍 ...

  4. 二叉树的构造(前序+中序)---(后序 + 中序)

    二叉树的构造(前序+中序)-(后序 + 中序) 思路:要对前序+中序(后序+中序)的构建树的动态过程要了解,思路比较简单,在了解了这个过程之后,理解下面代码就容易了. 过程 参考图: 前序 + 中序: ...

  5. PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...

  6. 先序序列和后序序列并不能唯一确定二叉树

    数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树. ...

  7. 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)

    7-10 先序序列创建二叉树,输出先序序列.中序序列.后序序列并输出叶子结点数 (10 分) 对于给定的二叉树,输出其先序序列.中序序列.后序序列并输出叶子结点数. 输入格式: 二叉树的先序遍历序列. ...

  8. 满二叉树先序序列转后序序列

    算法一 //利用先序序列和后序序列的关系直接转 void PreToPost(ElemType pre[], int l1, int h1, ElemType post[], int l2, int ...

  9. 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...

    已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...

最新文章

  1. 使用NLTK进行英文分词
  2. Scala的异常处理
  3. Spring-解决请求中文乱码问题
  4. 解决Tomact启动时问题 Port 8080 required by Tomcat v8.0 Server at localhost is already in use.
  5. [BZOJ4556][Tjoi2016Heoi2016]字符串 主席树+二分+倍增+后缀自动机
  6. WebApi 接口参数不再困惑:传参详解
  7. 数据库-优化-MYSQL数据库设计原则
  8. Web-DispatcherServletUrlPatterns
  9. Link节点类的改进——通过构建freelist自行管理内存
  10. 文字处理技术:布局的核心是行布局,难点是换行算法
  11. 波动率模型:现货、期货及期货期权
  12. 如何用GoldWave中文版提取伴奏?
  13. 电子密码锁程序C语言,基于51单片机的电子密码锁程序
  14. 安装wine及相关软件
  15. 关于利用计算机,关于计算机应用基础试题
  16. 翁帆给杨振宁的情书(中英文对照)
  17. 岁月是把杀猪刀,程序员刚实习VS几年后,从小鲜肉到老司机...
  18. kb2919442不适用计算机,Windows运维之Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机...
  19. nvm安装node成功,npm安装失败问题
  20. python低配贪食蛇

热门文章

  1. 河海大学计算机辅助,黄瑞
  2. 程序设计思维 A - 区间选点 II(差分约束)
  3. 无限级分类之递归查找家谱树
  4. to be solved
  5. Cerebral Cortex:岛叶二分法在情绪面孔内隐检测中的应用
  6. 2019CSP-J组题目-加工零件
  7. 椭圆隐式方程和参数方程的互相转换
  8. Kong 优雅实现微服务网关鉴权,登录场景落地实战篇
  9. 命令执行原理和利用知识点
  10. 【模电】NPN和PNP三极管的区别(一)