二叉树非递归遍历----前中后及层序的java实现
来源:互联网 发布:什么是软件需求管理 编辑:程序博客网 时间:2024/05/22 09:39
前序遍历:
利用栈实现循环,类似于图的深度优先遍历(DFS)。将根节点入栈,然后只要栈不为空,出栈并访问,接着依次将访问节点的右节点、左节点入栈。
public void preOrder(TreeNode root){ if(root==null) return; Stack<TreeNode> s=new Stack<TreeNode>(); s.push(root); while(!s.isEmpty()){ TreeNode temp=s.pop(); System.out.println(temp.val); if(temp.right!=null) s.push(temp.right); if(temp.left!=null) s.push(temp.left); } }中序遍历:
对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点,然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。处理过程如下:
对于任一结点P,
1)若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理;
2)若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子;
3)直到P为NULL并且栈为空则遍历结束
public void inOrder(TreeNode root){ if(root==null) return; Stack<TreeNode> s=new Stack<TreeNode>(); TreeNode node = root; while(node!=null||!s.isEmpty()){ while(node!=null){ s.push(node); node=node.left; } if(!s.isEmpty()){ node=s.pop(); System.out.println(node.val); node=node.right; } } }
后序遍历:
保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
public void postOrder(TreeNode root) { Stack<TreeNode> s=new Stack<TreeNode>(); TreeNode cur = null; //当前结点 TreeNode pre = null; //前一次访问的结点s.push(root); while(!s.empty()){ cur=s.peek(); if((cur.left== null && cur.right == null)||(pre!= null &&(pre==cur.left||pre==cur.right))){ //如果当前结点没有孩子结点或者孩子节点都已被访问过 System.out.println(cur.val); s.pop(); pre=cur; } else{ if(cur.left!=null) s.push(cur.right); if(cur.left!=null) s.push(cur.left); } } }
层序遍历:
用队列实现,先将根节点入队列,只要队列不为空,然后出队列,并访问,接着讲访问节点的左右子树依次入队列
public static void levelTravel(TreeNode root){ if(root==null)return; Queue<TreeNode> q=new LinkedList<TreeNode>(); TreeNode node = root; q.add(node); while(!q.isEmpty()){ node = q.poll(); System.out.println(node.val); if(node.left!=null) q.add(node.left); if(node.right!=null) q.add(node.right); } }
0 0
- 二叉树非递归遍历----前中后及层序的java实现
- 二叉树的递归、非递归及层序遍历的Java实现
- 用java实现二叉树相关操作(前序建树,前中后递归非递归遍历,层序遍历)
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 数据结构的C实现_二叉树的非递归遍历和层序遍历
- 二叉树的非递归中序遍历以及层序遍历实现
- 二叉树的深度与广度遍历及前序遍历递归非递归实现
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- Java实现二叉树的递归与非递归遍历
- Java实现二叉树的创建、递归/非递归遍历
- Java实现二叉树的递归、非递归遍历
- JAVA语言实现二叉树的层次遍历的非递归算法及递归算法。
- JAVA语言实现二叉树的层次遍历的非递归算法及递归算法
- Java方式实现二叉树的前中后序遍历的递归及非递归算法
- 二叉树的层序遍历(非递归)
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
- 二叉树的三种非递归遍历及层序遍历
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- redis系列--String常见命令
- Linux下JDK安装
- 开发前台页面的神器
- Observable_Observer
- android slidingmenu
- 二叉树非递归遍历----前中后及层序的java实现
- Yii2配置url重写
- CoreOS项目
- ubuntu安装openwatcom时Core Dump 错误
- LeetCode 89. Gray Code
- Swift - 开关按钮(UISwitch)的用法
- javascript的进阶性学习——知识点巩固
- 最牛叉的 Linux Shell 命令
- swift 获取app版本号及 ios 版本号