1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
class Solution { private List<Integer> leftBound; private List<Integer> rightBound; private List<Integer> leaves;
public List<Integer> boundaryOfBinaryTree(TreeNode root) { if (root == null) return new ArrayList<>(); leftBound = new ArrayList<>(); rightBound = new ArrayList<>(); leaves = new ArrayList<>(); List<Integer> ans = new ArrayList<>(); ans.add(root.val); if (root.left != null) { dfs(root.left, -1); } if (root.right != null) { dfs(root.right, 1); } for (int node : leftBound) { ans.add(node); } for (int node : leaves) { ans.add(node); } for (int node : rightBound) { ans.add(node); } return ans; }
private void dfs(TreeNode node, int status) { if (node == null) return; if (node.left == null && node.right == null) { leaves.add(node.val); } else if (status == -1) { leftBound.add(node.val); if (node.left != null) { dfs(node.left, -1); dfs(node.right, 0); } else { dfs(node.right, -1); } } else if (status == 1) { rightBound.add(0, node.val); if (node.right != null) { dfs(node.left, 0); dfs(node.right, 1); } else { dfs(node.left, 1); } } else { dfs(node.left, 0); dfs(node.right, 0); } } }
|
我们dfs然后告诉每个node它是左边界, 右边界还是都不是. 通过判断是否有children来判断是否是leaf.
时间复杂度: O(n)
空间复杂度: O(n)