1
1
package main
2
2
3
+ // Definition for a binary tree node.
4
+ type TreeNode struct {
5
+ Val int
6
+ Left * TreeNode
7
+ Right * TreeNode
8
+ }
9
+
3
10
func postorderTraversal (root * TreeNode ) []int {
4
11
5
- // empty tree
6
- if root == nil {
7
- return []int {}
8
- }
9
-
10
- nodeStack := []* TreeNode {root } // the nodes
11
- nodesSeen := []bool {false } // whether a node already seen
12
- values := make ([]int , 0 ) // values in postorder
13
-
14
- // traverse tree with stack
15
- for len (nodeStack ) != 0 {
16
- node := nodeStack [len (nodeStack )- 1 ]
17
-
18
- // leaf -> node seen; or children traversed
19
- if (node .Left == nil && node .Right == nil ) || nodesSeen [len (nodesSeen )- 1 ] {
20
- values = append (values , node .Val )
21
- nodeStack = nodeStack [:len (nodeStack )- 1 ] // pop node
22
- nodesSeen = nodesSeen [:len (nodesSeen )- 1 ]
23
- continue
24
- }
25
-
26
- nodesSeen [len (nodesSeen )- 1 ] = true // mark node as seen
27
-
28
- // push children on stack
29
- if node .Right != nil {
30
- nodeStack = append (nodeStack , node .Right )
31
- nodesSeen = append (nodesSeen , false )
32
- }
33
- if node .Left != nil { // traversed first, therefore put on stack second
34
- nodeStack = append (nodeStack , node .Left )
35
- nodesSeen = append (nodesSeen , false )
36
- }
37
- }
38
-
39
- return values
40
- }
12
+ // empty tree
13
+ if root == nil {
14
+ return []int {}
15
+ }
16
+
17
+ nodeStack := []* TreeNode {root } // the nodes
18
+ nodesSeen := []bool {false } // whether a node already seen
19
+ values := make ([]int , 0 ) // values in postorder
20
+
21
+ // traverse tree with stack
22
+ for len (nodeStack ) != 0 {
23
+ node := nodeStack [len (nodeStack )- 1 ]
24
+
25
+ // leaf -> node seen; or children traversed
26
+ if (node .Left == nil && node .Right == nil ) || nodesSeen [len (nodesSeen )- 1 ] {
27
+ values = append (values , node .Val )
28
+ nodeStack = nodeStack [:len (nodeStack )- 1 ] // pop node
29
+ nodesSeen = nodesSeen [:len (nodesSeen )- 1 ]
30
+ continue
31
+ }
32
+
33
+ nodesSeen [len (nodesSeen )- 1 ] = true // mark node as seen
34
+
35
+ // push children on stack
36
+ if node .Right != nil {
37
+ nodeStack = append (nodeStack , node .Right )
38
+ nodesSeen = append (nodesSeen , false )
39
+ }
40
+ if node .Left != nil { // traversed first, therefore put on stack second
41
+ nodeStack = append (nodeStack , node .Left )
42
+ nodesSeen = append (nodesSeen , false )
43
+ }
44
+ }
45
+
46
+ return values
47
+ }
0 commit comments