算法总结之 二叉树的非递归遍历
用递归解决的问题都能用非递归解决
这是因为无非就是利用函数栈来保存信息,如果自己申请的数据结构来代替栈,也可以实现相同功能。
实现非递归的先序遍历:
1 申请一个栈 stack
2 然后将头节点head压入stack
3 从stack中弹出栈顶节点 cur, 打印cur的节点值。 再将cur的右孩子压入stack, 最后将cur的左孩子压入stack
重复 直到stack为空
package TT; import java.util.Stack; public class Test117 { public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } public void preOrderUnrecur(Node head){ if(head !=null){ Stack<Node> stack=new Stack<Node>(); stack.add(head); while( !stack.isEmpty()){ head=stack.pop(); System.out.println(head.value+""); if(head.right !=null){ stack.push(head.right); } if(head.left != null){ stack.push(head.left); } } } System.out.println(); } }
非递归中序遍历
1 申请一个新的栈 stack 初始cur=head
2 把cur节点压入栈中 对以cur节点为头的整棵子树来说, 依次把左边界压入栈中,即不停的令 cur=cur.left 重复
3 不断重复步骤2 直到发现cur为null 此时从stack中弹出一个节点,记为node 打印node 的值 并且让cur=node.right 重复步骤2
4 当stack为null 且cur为null时, 整个过程停止
package TT; import java.util.Stack; public class Test118 { public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } public void inOrderUnRecur(Node head){ if(head !=null){ Stack<Node> stack = new Stack<Node>(); while(!stack.isEmpty() || head!=null){ if(head !=null){ stack.push(head); head=head.left; }else { head=stack.pop(); System.out.println(head.value+""); head=head.right; } } System.out.println(); } } }
非递归实现后序遍历 有两种方法 本博客介绍一种
两个栈实现后序遍历过程
1 申请两个栈 s1 s2 然后将头节点压入s1
2从s1中弹出的节点记为cur 然后将cur的左孩子和右孩子压入s1中
3 在整个过程中 每一个从s1弹出的节点都放进s2中
4不断重复2 和 3 直到s1为空 停止
从s2 中一次弹出节点并打印 打印的顺序就是后续遍历的顺序
package TT; import java.util.Stack; public class Test119 { public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } public void posOrderUnRecur1(Node head){ if(head !=null){ Stack<Node> s1 = new Stack<Node>(); Stack<Node> s2 = new Stack<Node>(); s1.push(head); while(!s1.isEmpty()){ head=s1.pop(); s2.push(head); if(head.left != null){ s1.push(head.left); } if(head.right != null){ s1.push(head.right); } } while(!s2.isEmpty()){ System.out.println(s2.pop().value+" "); } } System.out.println(); } }