【题目】
用递归和非递归方式,分别按照二叉树先序、中序和后序打印所有的节点。我们约定:先序遍历顺序为根、左、右;中序遍历顺序为左、根、右;后序遍历顺序为左、右、根。
【递归实现】
//递归遍历二叉树
//先序
public void preOrderRecur(Node head){
if(head==null){
return;
}
System.out.println(head.value+" ");
preOrderRecur(head.left);
preOrderRecur(head.right);
}
//中序
public void inOrderRecur(Node head){
if(head==null){
return;
}
inOrderRecur(head.left);
System.out.println(head.value+" ");
preOrderRecur(head.right);
}
//后序
public void posOrderRecur(Node head){
if(head==null){
return;
}
posOrderRecur(head.left);
posOrderRecur(head.right);
System.out.println(head.value+" ");
}
【非递归实现】
//非递归实现遍历二叉树
//先序
public void preOrderUnRecur(Node head){
if(head==null){
return;
}
//①申请栈,头节点head压入栈
Stack<Node> stack=new Stack<Node>();
stack.add(head);//add()是在尾部追加数据,继承自Vector
//②弹出head,打印该值,然后压入右孩子、左孩子
while(!stack.isEmpty()){
head=stack.pop();
System.out.println(head.value+" ");
if(head.right!=null){
stack.push(head.right);//push()是在前边追加数据
}
if(head.left!=null){
stack.push(head.left);
}
}
//③重复步骤2,直到stack为空
}
//中序
public void inOrderUnRecur(Node head) {
if (head == null) {
return;
}
// ①申请栈
Stack<Node> stack = new Stack<Node>();
while (!stack.isEmpty() || head != null) {
//②依次压入左边界,不断让head=head.left
if (head != null) {
stack.push(head);
head = head.left;
} else {
//③没有左边界了,弹出最上面的节点,打印,并令head=head.right,然后重复②
head = stack.pop();
System.out.println(head.value + " ");
head = head.right;
}
}
//④stack为空且cur为空,结束
}
//后序:两个栈实现
public void posOrderUnRecur(Node head){
if(head==null){
return;
}
//1.申请两个栈,将head压入s1
Stack<Node> s1=new Stack<Node>();
Stack<Node> s2=new Stack<Node>();
s1.push(head);
while(!s1.isEmpty()){
//2.从s1弹出中节点,压入s2,然后依次压入其左、右孩子到s1
s1.pop();
s2.push(head);
if(head.left!=null){
s1.push(head.left);
}
if(head.right!=null){
s1.push(head.right);
}
}
//3.弹出的节点都压入s2,重复步骤2,直到s1为空(s1压入顺序:左右,S2压入顺序:中右左)
//4.从s2依次弹出并打印(S2弹出顺序:左右中)
while(!s2.isEmpty()){
System.out.println(s2.pop().value+" ");
}
}