Binary Tree Traversal

Traversal (#66, #67, #68)

Recursion


Recursion 模板

public class Solution {
    public List<Integer> recursionTeraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        recursion(root, result);
        return result;
    }

    private void recursion(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        result.add(root.val);
        recursion(root.left, result);
        recursion(root.right, result);
    }
}

1. Preorder (中左右)

public class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        preorder(root, result);
        return result;
    }
 
    private void preorder(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        result.add(root.val);
        preorder(root.left, result);
        preorder(root.right, result);
    }
}

2. Inorder (左中右)

public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        inorder(root, result);
        return result;
    }
    
    private void inorder(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        inorder(root.left, result);
        result.add(root.val);
        inorder(root.right, result);
    }
}

3. Postorder (左右中)

public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        postorder(root, result);
        return result;
    }
    
    private void postorder(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        postorder(root.left, result);
        postorder(root.right, result);
        result.add(root.val);
    }
}

Non-Recursion


Non-Recursion 模板

public class Solution {
    public List<Integer> nonRecursionTeraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        List<Integer> result = new ArrayList<Integer>();
        while (root != null || !stack.empty()) {
            while (root != null) {
                result.add(root.val);
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            result.add(root.val);
            root = root.right;
        }
        Collections.reverse(result);
        return result;
    }
}

1. Preorder (中左右)

public class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        List<Integer> result = new ArrayList<Integer>();
        while (root != null || !stack.empty()) {
            while (root != null) {
                result.add(root.val);
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            root = root.right;
        }
        return result;
    }
}

2. Inorder (左中右)

public class Solution {
    public List<Integer>  inorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        List<Integer>  result = new ArrayList<Integer>();
        while (root != null || !stack.empty()) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            result.add(root.val);
            root = root.right;
        }
        return result;
    }
}

3. Postorder (左右中)

public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        List<Integer> result = new ArrayList<Integer>();
        while (root != null || !stack.empty()) {
            while (root != null) {
                result.add(root.val);
                stack.push(root);
                root = root.right;
            }
            root = stack.pop();
            root = root.left;
        }
        Collections.reverse(result);
        return result;
    }
}

Non-Recursion-2


Non-Recursion 模板 (例如:左中右是我们想看到的,即pop顺序,那相对的push顺序就应该是中左右,对于加入到result,划重点:先加入到result中,再push/pop)

public class Solution {
    public List<Integer> nonRecursionTeraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        
        TreeNode dummy = new TreeNode(0);
        dummy.right = root;
        
        Stack<TreeNode> stack = new Stack<>();
        stack.push(dummy);
        
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            if (node.right != null) {
                node = node.right;
                while (node != null) {
                    result.add(node.val);
                    stack.push(node);
                    node = node.left;
                }
            }
            if (!stack.isEmpty()) {
                result.add(stack.peek().val);
            }
        }
        Collections.reverse(result);
        return result;
    }
}

1. Preorder (中左右)

public class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
       
        TreeNode dummy = new TreeNode(0);
        dummy.right = root;
       
        Stack<TreeNode> stack = new Stack<>();
        stack.push(dummy);
       
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            if (node.right != null) {
                node = node.right;
                while (node != null) {
                    result.add(node.val);
                    stack.push(node);
                    node = node.left;
                }
            }
        }
        return result;
    }
}

2. Inorder (左中右)

public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        // write your code here
        ArrayList<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
       
        TreeNode dummy = new TreeNode(0);
        dummy.right = root;
       
        Stack<TreeNode> stack = new Stack<>();
        stack.push(dummy);
       
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            if (node.right != null) {
                node = node.right;
                while (node != null) {
                    stack.push(node);
                    node = node.left;
                }
            }
            if (!stack.isEmpty()) {
                result.add(stack.peek().val);
            }
        }
        return result;
    }
}

3. Postorder (左右中)

public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
       
        TreeNode dummy = new TreeNode(0);
        dummy.left = root;
       
        Stack<TreeNode> stack = new Stack<>();
        stack.push(dummy);
       
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            if (node.left != null) {
                node = node.left;
                while (node != null) {
                    result.add(node.val);
                    stack.push(node);
                    node = node.right;
                }
            }
        }
        Collections.reverse(result);
        return result;
    }
}

 Divide Conquer


Divide Conquer 模板

public class Solution {
    public List<Integer> divideConquerTeraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        if(root == null){
            return result;
        }

        List<Integer> left = divideConquerTeraversal(root.left);
        List<Integer> right = divideConquerTeraversal(root.right);

        result.add(root.val);
        result.addAll(left);
        result.addAll(right);

        return result;
    }
}

1. Preorder (中左右)

public class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        if(root == null){
            return result;
        }

        List<Integer> left = preorderTraversal(root.left);
        List<Integer> right = preorderTraversal(root.right);
   
        result.add(root.val);
        result.addAll(left);
        result.addAll(right);

        return result;
    }
}

2. Inorder (左中右)

public class Solution {
    public List<Integer>  inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        if(root == null){
            return result;
        }

        List<Integer> left = inorderTraversal(root.left);
        List<Integer> right = inorderTraversal(root.right);

        result.addAll(left);
        result.add(root.val);
        result.addAll(right);

        return result;
    }
}

3. Postorder (左右中)

public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        if(root == null){
            return result;
        }
   
        List<Integer> left = postorderTraversal(root.left);
        List<Integer> right = postorderTraversal(root.right);
   
        result.addAll(left);
        result.addAll(right);
        result.add(root.val);

        return result;
    }
}

Comments

Popular posts from this blog

Union Find 模板

Tree的经典题

Tree DFS