545. Boundary of Binary Tree

9 阅读1分钟

image.png

image.png

image.png

Solution: average time O(h) worst case is O(n)

Find seperately.

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

        res.add(root.val);

        findLeftBoundary(root.left);
        findLeaf(root.left);
        findLeaf(root.right);
        findRightBoundary(root.right);

        return res;
    }

    public void findLeaf(TreeNode node) {
        if (node == null) {
            return;
        }

        // node is leaf node
        if (node.left == null && node.right == null) {
            res.add(node.val);
            return;
        }

        findLeaf(node.left);
        findLeaf(node.right);
    }

    public void findLeftBoundary(TreeNode node) {
        if (node == null || (node.left == null && node.right == null)) {
            return; // skip leaf
        }

        res.add(node.val);

        if (node.left != null) {
            findLeftBoundary(node.left);
        } else {
            findLeftBoundary(node.right);
        }
    }

    public void findRightBoundary(TreeNode node) {
        if (node == null || (node.left == null && node.right == null)) {
            return; // skip leaf
        }
        
        if (node.right != null) {
            findRightBoundary(node.right);
        } else {
            findRightBoundary(node.left);
        }

        res.add(node.val); // add reverse, after visiting child
    }
}