Skip to content

Commit c9c0b7f

Browse files
committed
leetcode
1 parent a4654f1 commit c9c0b7f

File tree

1 file changed

+43
-36
lines changed

1 file changed

+43
-36
lines changed
Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,47 @@
11
package main
22

3+
// Definition for a binary tree node.
4+
type TreeNode struct {
5+
Val int
6+
Left *TreeNode
7+
Right *TreeNode
8+
}
9+
310
func postorderTraversal(root *TreeNode) []int {
411

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

Comments
 (0)