今天來review一下,直接上重點非遞迴(本篇借鑒不少,多謝諸位):
public class TreeNode {public int val;public TreeNode left;public TreeNode right;TreeNode(int x) {val = x;left = null;right = null;} TreeNode(){}; public void setValue(int a) { this.val=a; }}
前序走訪 :
public ArrayList<Integer> preorderTraversal(TreeNode root) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. TreeNode p=root; ArrayList<Integer> a = new ArrayList<Integer>(); Stack<TreeNode> s = new Stack<TreeNode>(); while(p!=null||!s.isEmpty()) { if(p!=null) { a.add(p.val); if(p.right!=null) s.push(p.right); if(p.left!=null) s.push(p.left); p=null; } if(!s.isEmpty()) { p = s.pop(); } } return a; }
中序遍曆
public ArrayList<Integer> inorderTraversal(TreeNode root) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. Stack<TreeNode> stack= new Stack<TreeNode>(); ArrayList<Integer> a = new ArrayList<Integer>(); TreeNode p=root; while(!stack.isEmpty()||p!=null) { if(p!=null) { stack.push(p); p=p.left; } else{ p=stack.peek(); stack.pop(); a.add(p.val); p=p.right; } }return a; }
後序遍曆
public ArrayList<Integer> postorderTraversal(TreeNode root) {// IMPORTANT: Please reset any member data you declared, as// the same Solution instance will be reused for each test case.ArrayList<Integer> a = new ArrayList<Integer>();Stack<TreeNode> s = new Stack<TreeNode>();TreeNode cur = root;TreeNode pre = null;while (cur != null || !s.isEmpty()) {if (cur.left != null || cur.right != null) { if (pre!=null&&(pre == cur.right || (pre == cur.left && cur.right == null))) {a.add(cur.val);pre = cur;} else {s.push(cur);if (cur.right != null)s.push(cur.right);if (cur.left != null)s.push(cur.left);}} else {a.add(cur.val);pre = cur;}if(!s.isEmpty())cur = s.pop();else cur = null;}return a;}
層序遍曆
方法1:重新定義個新的Node結構,該結構包含level欄位。
class Node {TreeNode node;int level;Node() {}public Node(TreeNode n, int l) {node = n;level = l;}}public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {// IMPORTANT: Please reset any member data you declared, as// the same Solution instance will be reused for each test case.Queue<Node> queue = new LinkedList<Node>();ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();ArrayList<Integer> b = new ArrayList<Integer>();a.clear();if (root == null)return a;queue.offer(new Node(root, 0));int curlevel = -1;while (!queue.isEmpty()) {Node p = queue.poll();if (p.node.left != null) {queue.offer(new Node(p.node.left, p.level + 1));}if (p.node.right != null) {queue.offer(new Node(p.node.right, p.level + 1));}if (curlevel != p.level) {if (curlevel != -1)a.add(b);curlevel = p.level;b = new ArrayList<Integer>();b.add(p.node.val);} elseb.add(p.node.val);}a.add(b);return a;}
方法2:在每行結束加入一個null元素作為一個flag來判斷是否為一個新的Level
public ArrayList<ArrayList<Integer>> levelOrder2(TreeNode root) {Queue<TreeNode> queue = new LinkedList<TreeNode>();ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();ArrayList<Integer> b = new ArrayList<Integer>();queue.add(root);queue.add(null);while(!queue.isEmpty()) {TreeNode temp = queue.peek();if(temp!=null) {b.add(temp.val);if(temp.left!=null)queue.add(temp.left);if(temp.right!=null)queue.add(temp.right);queue.poll();}else {queue.poll();queue.add(null);a.add(b);b = new ArrayList<Integer>();}}return a;}