二叉树的非递归遍历

来源:互联网 发布:文网文添加域名 编辑:程序博客网 时间: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