forked from fishercoder1534/Leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
_545.java
116 lines (100 loc) · 3.7 KB
/
_545.java
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package com.fishercoder.solutions;
import com.fishercoder.common.classes.TreeNode;
import java.util.ArrayList;
import java.util.List;
/**
* 545. Boundary of Binary Tree
*
* Given a binary tree, return the values of its boundary in anti-clockwise direction starting from root.
* Boundary includes left boundary, addLeaves, and right boundary in order without duplicate nodes.
* Left boundary is defined as the path from root to the left-most node.
* Right boundary is defined as the path from root to the right-most node.
* If the root doesn't have left subtree or right subtree,
* then the root itself is left boundary or right boundary.
* Note this definition only applies to the input binary tree, and not applies to any subtrees.
* The left-most node is defined as a leaf node you could reach when you always firstly travel
* to the left subtree if exists. If not, travel to the right subtree.
* Repeat until you reach a leaf node.
* The right-most node is also defined by the same way with left and right exchanged.
Example 1
Input:
1
\
2
/ \
3 4
Ouput:
[1, 3, 4, 2]
Explanation:
The root doesn't have left subtree, so the root itself is left boundary.
The addLeaves are node 3 and 4.
The right boundary are node 1,2,4. Note the anti-clockwise direction means you should output reversed right boundary.
So order them in anti-clockwise without duplicates and we have [1,3,4,2].
Example 2
Input:
____1_____
/ \
2 3
/ \ /
4 5 6
/ \ / \
7 8 9 10
Ouput:
[1,2,4,7,8,9,10,6,3]
Explanation:
The left boundary are node 1,2,4. (4 is the left-most node according to definition)
The addLeaves are node 4,7,8,9,10.
The right boundary are node 1,3,6,10. (10 is the right-most node).
So order them in anti-clockwise without duplicate nodes we have [1,2,4,7,8,9,10,6,3].
*/
public class _545 {
public static class Solution1 {
public List<Integer> boundaryOfBinaryTree(TreeNode root) {
List<Integer> nodes = new ArrayList<>();
if (root == null) {
return nodes;
}
nodes.add(root.val);
leftBoundary(root.left, nodes);
addLeaves(root.left, nodes);
addLeaves(root.right, nodes);
rightBoundary(root.right, nodes);
return nodes;
}
public void leftBoundary(TreeNode root, List<Integer> nodes) {
if (root == null || (root.left == null && root.right == null)) {
/**we don't want to add any LEAVES in leftBoundary and rightBoundary functions either,
* that's why we have the later condition in the if branch.*/
return;
}
nodes.add(root.val);// add BEFORE child visit
if (root.left == null) {
leftBoundary(root.right, nodes);
} else {
leftBoundary(root.left, nodes);
}
}
public void rightBoundary(TreeNode root, List<Integer> nodes) {
if (root == null || (root.right == null && root.left == null)) {
return;
}
if (root.right == null) {
rightBoundary(root.left, nodes);
} else {
rightBoundary(root.right, nodes);
}
nodes.add(root.val); // add AFTER child visit(reverse)
}
public void addLeaves(TreeNode root, List<Integer> nodes) {
if (root == null) {
return;
}
if (root.left == null && root.right == null) {
nodes.add(root.val);
return;
}
addLeaves(root.left, nodes);
addLeaves(root.right, nodes);
}
}
}