Tree Traversal

2018-03-28  本文已影响0人  Super_Alan

Binary TreeNode class

/**
* Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

BFS

https://leetcode.com/problems/binary-tree-level-order-traversal/description/

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> valuesByLevel = new ArrayList<>();
    if (root == null) {
        return valuesByLevel;
    }
    
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    queue.offer(root);
    
    while (!queue.isEmpty()) {
        ArrayList<Integer> level = new ArrayList<>();
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            TreeNode node = queue.poll();
            level.add(node.val);
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        valuesByLevel.add(level);
    }
    
    return valuesByLevel;
}

DFS: Preorder

https://leetcode.com/problems/binary-tree-preorder-traversal/description/

iteration

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> res = new LinkedList<>();
    Stack<TreeNode> stack = new Stack<>();
    TreeNode runner = root;
    
    while (runner != null || !stack.isEmpty()) {
        if (runner == null) {
            runner = stack.pop();
        }
        res.add(runner.val);
        if (runner.right != null) {
            stack.push(runner.right);
        }
        runner = runner.left; // not checking null or not. null indicates stack need to pop
    }
    
    return res;
}

recursion

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<Integer>();
    preorderHelper(root, res);
    return res;
}

private void preorderHelper(TreeNode node, List<Integer> res) {
    if (node == null) {
        return;
    }
    res.add(node.val);
    preorderHelper(node.left, res);
    preorderHelper(node.right, res);
}

DFS: Inorder

https://leetcode.com/problems/binary-tree-inorder-traversal/description/

iteration

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> res = new LinkedList<>();
    Stack<TreeNode> stack = new Stack<>();
    TreeNode runner = root;
    
    while (runner != null || !stack.isEmpty()) {
        while (runner != null) {
            stack.push(runner);
            runner = runner.left;
        }
        runner = stack.pop();
        res.add(runner.val);
        runner = runner.right;
    }
    
    return res;
}

recursion

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> res = new LinkedList<>();
    inorderHelper(root, res);
    return res;
}

private void inorderHelper(TreeNode node, List<Integer> res) {
    if (node == null) {
        return;
    }
    
    inorderHelper(node.left, res);
    res.add(node.val);
    inorderHelper(node.right, res);
}

divide & conquer

// a version of recursion
leftRes = ...
rightRes = ...
res = (leftRes, rightRes, currentNode)

no extra space, in place

modify the Tree object to make it like a list.


DFS: Postorder

https://leetcode.com/problems/binary-tree-postorder-traversal/description/

iteration

public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> res = new LinkedList<Integer>();
    Stack<TreeNode> stack = new Stack<>();
    TreeNode runner = root;
    
    while (runner != null || !stack.isEmpty()) {
        while (runner != null) {
            stack.push(runner);
            runner = runner.left;
            if (runner == null) {
                runner = stack.peek().right;
            }
        }
        
        runner = stack.pop();
        res.add(runner.val);
        
        // 如果 runner 为 rightChild, pop;
        // 如果 runner 为 leftChild,更新 runner 为 parent.rightChild.
        while (!stack.isEmpty() && runner == stack.peek().right) {
            runner = stack.pop();
            res.add(runner.val);
        }
        
        runner = stack.isEmpty() ? null : stack.peek().right;
    }
    
    return res;
}

recursion

public List<Integer> postorderTraversalRecursive(TreeNode root) {
    List<Integer> res = new LinkedList<Integer>();
    postorderTraversalHelper(res, root);
    return res;
}

private void postorderTraversalHelper(List<Integer> res, TreeNode root) {
    if (root == null) {
        return;
    }

    postorderTraversalHelper(res, root.left);
    postorderTraversalHelper(res, root.right);
    res.add(root.val);
}
上一篇下一篇

猜你喜欢

热点阅读