import java.util.Stack; class Node{ Node left; Node right; char val; public void Node(char value){ this.val = value; } } public class Solutions{ public void preOrderUnRecur(Node head){ //非递归 前序遍历 if(head == null) return; Stack<Ndoe> sk = new Stack<>(); sk.push(head); while(!sk.isEmpty()){ //先访问中间结点,再将**右左**节点入栈 head=sk.pop(); System.out.print(n.val + " "); if(head.right != null){ sk.push(head.right); } if(head.left!=null){ sk.push(head.left); } } } public void inOrderUnRecur(Node head){ //非递归,中序遍历 if(head == null) return; Stack<Ndoe> sk = new Stack<>(); while(head != null && !sk.isEmpty()){ //先入栈,再访问。先走到最左叶子,再往回返着中序遍历 sk.push(head); head = head.left; }else{ head = sk.pop(); System.out.print(n.val + " "); head = head.right; } } } public void posOrderUnRecur1(Node head){ //非递归,后序遍历,双栈法 if(head == null) return; Stack<Ndoe> s1 = new Stack<>(); Stack<Ndoe> s2 = new Stack<>(); s1.push(head); //子树根先入s1,再出栈入s2,同时它的先左后右子树入s1 //左右子树出s1入s2后,变成右在下,左在上,出s2后顺序变成 左-右-中 while(!s1.isEmpty()){ head = s1.pop(); s2.push(head); if(head.left != null){ s1.push(head.right); } if(head.right!=null){ s1.push(head.right); } } //s2出栈即访问 while(!s2.isEmpty()){ System.out.print(s2.pop().val+" "); } } public void posOrderUnRecur2(Node head){ //非递归,后序遍历,辅助标记 if(head == null) return; Stack<Ndoe> sk = new Stack<>(); Node tmp = null;//标记 while(head != null || !sk.isEmpty()){ //一直往左走 while(head!=null){ sk.push(head); head = head.left; } //如果当前结点没访问过,且右子树不空,否则访问右子树 head = sk.peek(); if(head != tmp && head.right!=null){ head = head.right; }els{//否则出栈,访问,并标记 sk.pop(); System.out.print(head.val + " "); tmp = head; head = null;//访问指针置空,从而后续打印:左右中 } } } }