[关闭]
@w1024020103 2017-07-01T10:43:17.000000Z 字数 2859 阅读 1014

Chapter 3 Binary Tree Divide Conquer

Jiuzhang


Outline

image_1bjrtv8ubuorrl2ff8a103m89.png-131.3kB

Time Complexity Tranning

image_1bjru04vl1neg14fg14h5m3q1251m.png-82.8kB

T(n) = T(n/2) + O(n)的情况 >>>> o(nlogn)

image_1bjrv7vrf9l25fu1se41hlhjnu20.png-85.2kB

image_1bjrvjq9m7r9mks1pgp50p1e0b2d.png-91.8kB

T(n) = T(n/2) + O(1)的情况 >>>> o(n)

image_1bjs0g0hl1ucn1qtu1ilr1hd21def2q.png-88.7kB
image_1bjs0lmlup6p3t11m7c2121ia37.png-87.3kB

Preorder, Inorder, Postorder

会不会写这个是鉴别你会不会写程序的指标。
Non-recursion(or iterative)的preorder, inorder要求背下来, traversal和divide and conquer要求三个都会自己写。

这个视频很详细地讲解了non recursion方法的实施过程:
Preorder Traversal Without Recursion using stack

preoder traversal的non-recursive方法会用stack,老师提到,几乎所有本来用recursion很好做的题要用non recursion做的话,都会用到Stack。

注意在 while 循坏里边,是先看 temp的right child是否为空,若否则push到stack里面;再看left child。 原因是Stack是先进后出filo的数据结构。preorder是root,left,right的顺序,所以我们要在pop掉root之后,先往 stack里边push进去right,再是push进去left.

  1. // preorder traversal non-recursive way
  2. public class Solution {
  3. public ArrayList<Integer> preordertraversal(TreeNode root){
  4. ArrayList<Integer> preorder = new ArrayList<>();
  5. if (root == null) {
  6. return preorder;
  7. }
  8. Stack<TreeNode> stack = new Stack<TreeNode>();
  9. stack.push(root);
  10. while (!stack.isEmpty()){
  11. TreeNode temp = stack.pop();
  12. preorder.add(temp.val);
  13. if (temp.right != null) {
  14. stack.push(temp.right);
  15. }
  16. if (temp.left != null) {
  17. stack.push(temp.left);
  18. }
  19. }
  20. return preorder;
  21. }
  22. }

preorder的traversal方法:

  1. public class Solution{
  2. public ArrayList<Integer> preorderTraversal(TreeNode root){
  3. ArrayList<Integer> result = new ArrayList<>();
  4. preorder(root,result);
  5. return result;
  6. }
  7. private void preorder(TreeNode root, ArrayList<Integer> result){
  8. if (root == null){
  9. return;
  10. }
  11. result.add(root.val);
  12. preorder(root.left,result);
  13. preorder(root.right,result);
  14. }
  15. }

preorder的divide conquer方法:

  1. public class Solution {
  2. public ArrayList<Integer> preorderTraversal(TreeNode root){
  3. ArrayList<Integer> result = new ArrayList<>();
  4. if (root == null){
  5. return result;
  6. }
  7. //divide
  8. ArrayList<Integer> left = preorderTraversal(root.left);
  9. ArrayList<Integer> right = preorderTraversal(root.right);
  10. //conquer
  11. result.add(root.val);
  12. result.addAll(left);
  13. result.addAll(right);
  14. return result;
  15. }
  16. }

inorder traversal non-recursive using stack:

对于具体步骤印度老师的讲解:
Inorder Tree Traversal without Recursion | GeeksforGeeks

image_1bjsrvoul389in91qdj1dvi1f5k3k.png-122.9kB

这道题我看着视频是可以理解的,但是要我自己写还是挺难写的,每一次current node的变化不好想,老师提示要背下来preorder和inorder的
non recursive方法,现在记住就好。

  1. public class Solution {
  2. /**
  3. * @param root: The root of binary tree.
  4. * @return: Inorder in ArrayList which contains node values.
  5. */
  6. public ArrayList<Integer> inorderTraversal(TreeNode root) {
  7. // write your code here
  8. ArrayList<Integer> inorder = new ArrayList<>();
  9. Stack<TreeNode> stack = new Stack<TreeNode>();
  10. TreeNode current = root;
  11. while (current!= null || !stack.isEmpty()){
  12. while (current != null){
  13. stack.push(current);
  14. current = current.left;
  15. }
  16. current = stack.pop();
  17. inorder.add(current.val);
  18. current = current.right;
  19. }
  20. return inorder;
  21. }
  22. }

postorder的recursion方法

  1. public class Solution{
  2. public ArrayList<Integer> postorderTraversal(TreeNode root){
  3. ArrayList<Integer> result = new ArrayList<>();
  4. if (root == null) {
  5. return result;
  6. }
  7. //divide
  8. TreeNode left = postorderTraversal(root.left);
  9. TreeNode right = postorderTraversal(root.right);
  10. //conquer
  11. result.addAll(left);
  12. result.addAll(right);
  13. result.add(root.val(;
  14. return result;
  15. }
  16. }

traverse和divide conquer的主要联系和区别:
- 他们都是递归方法
- traverse的result会被当作参数传到方法体内;divide conquer的result会直接返回

屏幕快照 2017-07-01 上午10.40.19.png-301.2kB

Quicksort Mergesort

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注