二叉树实体定义:

/*** 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. CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)
  2. linux 下常见启动文件配置
  3. 函数调用栈的获取原理分析【转】
  4. Java中Date各种相关用法
  5. 【SDL】SDL学习笔记二 定时器
  6. 多媒体视频知识入门贴zt(二)
  7. shell 脚本比较字符串相等_LINUX快速入门第十六章:Shell 流程控制
  8. ping端口_干货分享:shell脚本批量telnet ip 端口
  9. c++ 获得linux进程内存大小,C/C++获取进程常驻内存大小(get the process resident set size )...
  10. c语言提示少分号,问什么C程序里总是提示缺少分号;,而明明有分号?
  11. ASP.NET Core 使用Redis 存储Session 实现共享 Session
  12. 拉普拉斯金字塔融合原理浅析
  13. 卡巴斯基发现医疗IT系统存安全漏洞
  14. C语言关于素数个数的求法
  15. Windbg分析蓝屏Dump文件
  16. 炒外汇APP平台哪个好,排名前十的炒外汇平台
  17. 2021-11-01 讲题题解
  18. 戴尔服务器连接显示器无信号 键盘灯不亮,键盘灯不亮按键没反应怎么回事及解决办法...
  19. Python进制转换与ASCII转换
  20. ConvE,知识图谱嵌入(KGE) autodl 服务器运行

热门文章

  1. 鲲鹏Bigdata pro 之日志分析综合实验-补充细节
  2. 和99.9%的人的认知完全相反的富人思维
  3. 下载数据库名前加“#”方法
  4. 解决clion多个mian函数问题
  5. Qt Opengl 给两个立方体设置两中不同颜色
  6. 未来计算机网络科技发展趋势,未来计算机网络的发展趋势
  7. PC817做IO输出使用方法
  8. (Demo分享)利用JavaScript(JS)做一个可输入分钟的倒计时钟功能
  9. 基于tkinter制作的一个策略小游戏
  10. Kubernetes部署(一):K8s 二进制方式安装