二叉树的非递归遍历
来源:互联网 发布:文网文添加域名 编辑:程序博客网 时间:2024/06/05 23:11
2.1先序非递归
算法:如果节点不空,则遍历,入栈并且向左走,否则,弹出栈顶,向右走一步。
//先序非递归public static void preTrave(TreeNode root){Stack<TreeNode> s = new Stack<TreeNode>();TreeNode p = root;while(p!=null || !s.empty()){while(p!=null){System.out.println(p.val);s.push(p);p = p.left;}if(!s.empty()){p = s.pop();p = p.right;}}}
2.2 中序遍历
算法:和先序非递归遍历的不同是,访问节点的时机不同。中序遍历,是在往右拐的时候,说明从左子树返回,这时候先访问根节点,然后转向右子树。
//中序非递归public static void inOrderTrave(TreeNode root){Stack<TreeNode> s = new Stack<TreeNode>();TreeNode p = root;while(p!=null || !s.empty()){if(p!=null) {s.push(p);p = p.left;}else{p = s.pop();System.out.print(p.val);p = p.right;}}}
2.3 后序遍历非递归
算法:后序遍历相对前两个比较复杂,因为必须要访问完左右子节点之后才能访问根,因此要记录下是从左子树返回还是右子树返回,如果是从右子树返回,则访问根节点。
//后序非递归public static void postVisit(TreeNode root){Stack<TreeNode> s = new Stack<TreeNode>();TreeNode p = root;TreeNode pre = null;//上一个访问输出的节点while(p!=null || !s.empty()){if(p!=null) {s.push(p);p = p.left;}else{p = s.peek();//执行到这里说明左子树为空,注意这里不能出栈,只有从右子树返回才能出栈if(p.right == null || pre == p.right){//此时1,右子树为空,2,从右子树返回,则访问根节点。p = s.pop();System.out.print(p.val);pre = p;p = null;}else{//右子树不空,并且不是从右子树返回,则折向右子树访问p = p.right;}}}}
0 0
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的递归遍历与非递归遍历
- python堆排序
- 暑期社会实践心得
- java字符串分解 StringTokenizer用法
- java各大排序算法总结
- Vue.js——60分钟webpack项目模板快速入门【8】
- 二叉树的非递归遍历
- 《自控力》阅读笔记二
- Vue.js——vue-router 60分钟快速入门【9】
- openId导致的微信中“下单账号和支付账号不一致”原因及解决办法
- Codeforces Round #370 (Div. 2)
- Vert.x - Java 的新领土
- Aurora一些使用过程中碰到的问题
- POJ 2513 字典树+一笔画问题
- Could not get lock