[算法]死磕二叉樹專題算法
阿新 • • 發佈:2018-04-11
AC stack empty out pre else 二叉 後序遍歷 兩個
1. 二叉樹遍歷(遞歸和非遞歸)
構造二叉樹:
class Node{ public String value; public Node left; public Node right; public Node(String value) { this.value = value; } }
遞歸版前序遍歷:
public static void preOrder(Node head){ if(head != null){ System.out.print(head.value+ " "); preOrder(head.left); preOrder(head.right); } }
遞歸版中序遍歷:
public static void inOrder(Node head){ if(head != null){ inOrder(head.left); System.out.print(head.value + " "); inOrder(head.right); } }
遞歸版後序遍歷:
public static void posOrder(Node head){ if(head != null){ posOrder(head.left); posOrder(head.right); System.out.print(head.value + " "); } }
非遞歸版前序遍歷:
public static void preOrder(Node head){ if(head != null){ Stack<Node> stack = new Stack<>(); stack.push(head); while(!stack.isEmpty()){ Node pop = stack.pop(); System.out.print(pop.value + " "); if(pop.right != null) stack.push(pop.right); if(pop.left != null) stack.push(pop.left); } } }
非遞歸版中序遍歷:
public static void inOrder(Node head){ if(head != null){ Stack<Node> stack = new Stack<>(); while(!stack.isEmpty() || head != null){ if(head != null){ stack.push(head); head = head.left; }else{ head = stack.pop(); System.out.print(head.value + " "); head = head.right; } } } }
非遞歸版後序遍歷:
public static void postOrder(Node head){ if(head != null){ Stack<Node> stack1 = new Stack<>(); Stack<Node> stack2 = new Stack<>(); stack1.push(head); while(!stack1.isEmpty()){ Node pop = stack1.pop(); stack2.push(pop); if(pop.left != null){ stack1.push(pop.left); } if(pop.right != null){ stack1.push(pop.right); } } while(!stack2.isEmpty()){ System.out.print(stack2.pop().value + " "); } } }
這裏用了兩個棧,其實一個棧也能實現,這裏這樣做是因為可以和前序遍歷對比著記,比較容易。
[算法]死磕二叉樹專題算法