时间O(n), 空间O(1)node
public List<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); traverse(root, result); return result; } private void traverse(TreeNode root, ArrayList<Integer> result){ if (root == null){ return; } result.add(root.val); traverse(root.left, result); traverse(root.right, result); }
时间O(n), 空间O(logn) 由于在遍历过程当中,栈中最多会存储从root到最深的leave这一条path上的所有node,即树高O(lgn)post
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); if (root == null) { return res; } Stack<TreeNode> stack = new Stack<TreeNode>(); while (root != null || !stack.isEmpty()) { if (root != null) { stack.push(root); res.add(root.val); root = root.left; } else { root = stack.pop(); root = root.right; } } return res; }
时间O(n), 空间O(1)code
public List<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); traverse(root, result); return result; } private void traverse(TreeNode root, ArrayList<Integer> result){ if (root == null){ return; } result.add(root.val); traverse(root.left, result); traverse(root.right, result); }
时间O(n), 空间O(logn) 由于在遍历过程当中,栈中最多会存储从root到最深的leave这一条path上的所有node,即树高O(lgn)递归
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); if (root == null) { return res; } helper(res, root); return res; } public void helper(List<Integer> res, TreeNode root) { if (root == null) { return; } helper(res, root.left); res.add(root.val); helper(res, root.right); }
时间O(n), 空间O(1)接口
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); if (root == null) { return res; } Stack<TreeNode> stack = new Stack<TreeNode>(); while (!stack.isEmpty() || root != null) { if (root != null) { stack.push(root); root= root.left; } else { root = stack.pop(); res.add(root.val); root = root.right; } } return res; }
时间O(n), 空间O(1)List
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); if (root == null) { return res; } helper(res, root); return res; } public void helper(List<Integer> res, TreeNode root) { if (root == null) { return; } helper(res, root.left); helper(res, root.right); res.add(root.val); }
在出栈的时候须要分状况一下:
1)若是当前栈顶元素的右结点存在而且还没访问过(也就是右结点不等于上一个访问结点),那么就把当前结点移到右结点继续循环;
2)若是栈顶元素右结点是空或者已经访问过,那么说明栈顶元素的左右子树都访问完毕,应该访问本身继续回溯了。搜索
时间O(n), 空间O(logn) 由于在遍历过程当中,栈中最多会存储从root到最深的leave这一条path上的所有node,即树高O(lgn)循环
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer>(); if (root == null) { return res; } TreeNode pre = null; Stack<TreeNode> stack = new Stack<TreeNode>(); while (root != null || !stack.isEmpty()) { if (root != null) { stack.push(root); root = root.left; } else { TreeNode peak = stack.peek(); if (peak.right != null && pre != peak.right) {//若是当前栈顶元素的右结点存在而且还没访问过(也就是右结点不等于上一个访问结点)就访问右结点 / root = peak.right; } else {//若是栈顶元素右结点是空或者已经访问过,那么说明栈顶元素的左右子树都访问完毕 须要把栈顶元素加入结果而且回溯上一层 stack.pop(); res.add(peak.val); pre = peak; } } } return res; }
相似树的广度优先搜索, 用queue来实现, 使用queue保存每层的节点。出队和将子节点入队的实现使用 for 循环,将每一轮的节点输出。
Queue是接口, LinkedList能够实现此接口。rsa
时间O(n) 空间 O(n)遍历
public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res= new ArrayList<List<Integer>>(); if (root == null) { return res; } Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.offer(root); while (!queue.isEmpty() ) { int size = queue.size(); List<Integer> tem = new ArrayList<Integer>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); tem.add(node.val); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } res.add(tem); //res.add(0, tem); //for II } return res; }
时间O(n) 空间 O(n)
public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if (root == null) { return res; } boolean flag = true; Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.offer(root); while (!queue.isEmpty()) { int size = queue.size(); List<Integer> tem = new ArrayList<Integer>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } if (flag) { tem.add(node.val); } else { tem.add(0,node.val); } } flag = !flag; res.add(tem); } return res; }