二叉树的遍历:递归法和非递归法
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
class TreeNode {
TreeNode left = null;
TreeNode right = null;
int val = 0;
public TreeNode(int val) {
this.val = val;
}
}
//遍历二叉树
public class Ergodic {
//1.先序遍历-递归
public static void preOrderPrint(TreeNode node){
if(node != null){
System.out.print(node.val+" ");
preOrderPrint(node.left);
preOrderPrint(node.right);
}
}
//2.中序遍历-递归
public static void midOrderPrint(TreeNode node){
if(node != null){
midOrderPrint(node.left);
System.out.println(node.val);
midOrderPrint(node.right);
}
}
//3.后序遍历-递归
public static void afterOrderPrint(TreeNode node){
if(node != null){
afterOrderPrint(node.left);
afterOrderPrint(node.right);
System.out.println(node.val);
}
}
//4.先序遍历-非递归版
public static void preNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
System.out.println(currNode.val);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
currNode = currNode.right;
}
}
}
//5.中序遍历-非递归版
public static void midNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
System.out.println(currNode.val);
currNode = currNode.right;
}
}
}
//6.后序遍历-非递归版
public static void afterNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
Set<TreeNode> set =new HashSet<TreeNode>();
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
set.add(currNode);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
if(set.contains(currNode)){
boolean b = set.remove(currNode);
stack.push(currNode);
currNode = currNode.right;
}else{
System.out.println(currNode.val);
currNode = null;
}
}
}
}
}