二叉树的先中后的递归与非递归实现
递归
public static void pro(Node head){
if(head ==null){
return;
}
System.out.println(head.val);
pro(head.left);
pro(head.right);
}
public static void into(Node head){
if(head==null){
return ;
}
into(head.left);
System.out.println(head.val);
into(head.right);
}
public static void last(Node head){
if(head==null){
return ;
}
last(head.left);
last(head.right);
System.out.println(head.val);
}
递归改进版本-返回值的形式
public static java.util.List<Integer> pro2(Node head){
java.util.List<Integer> list = new java.util.ArrayList<>();
process(head,list);
return list;
}
public static void process(Node x,java.util.List<Integer> list){
if (x==null){
return;
}
list.add(x.val);
process(x.left,list);
process(x.right,list);
}
public static java.util.List into2( TreeNode root){
java.util.List<Integer> list = new java.util.ArrayList<>();
processInto(root,list);
return list;
}
public static void processInto(TreeNode x, java.util.List<Integer> list){
if(x == null){
return;
}
processInto(x.left,list);
list.add(x.val);
processInto(x.right,list);
}
非递归
public static java.util.List<Integer> pre3(TreeNode root){
if(root==null){
return new java.util.ArrayList<Integer>();
}
java.util.List<Integer> list = new java.util.ArrayList<>();
java.util.Stack<TreeNode> stack = new java.util.Stack<>();
stack.add(root);
while (!stack.isEmpty()){
root = stack.pop();
list.add(root.val);
if(root.right!=null){
stack.add(root.right);
}
if(root.left!=null){
stack.add(root.left);
}
}
return list;
}
public static java.util.List<Integer> into3(TreeNode root){
if(root==null){
return new java.util.ArrayList<Integer>();
}
java.util.List<Integer> list = new java.util.ArrayList<>();
java.util.Stack<TreeNode> stack = new java.util.Stack<>();
while (!stack.isEmpty()||root!=null){
if(root!=null){
stack.add(root);
root = root.left;
}else {
root = stack.pop();
list.add(root.val);
root = root.right;
}
}
return list;
}
public static java.util.List<Integer> last(TreeNode root){
if(root==null){
return new java.util.ArrayList<Integer>();
}
java.util.List<Integer> list = new java.util.ArrayList<>();
java.util.Stack<TreeNode> stack1 = new java.util.Stack<>();
java.util.Stack<TreeNode> stack2 = new java.util.Stack<>();
stack1.add(root);
while (!stack1.isEmpty()) {
root = stack1.pop();
stack2.add(root);
if (root.left != null) {
stack1.add(root.left);
}
if (root.right != null) {
stack1.add(root.right);
}
}
while (!stack2.isEmpty()){
list.add(stack2.pop().val);
}
return list;
}