- Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path145.postorderTraversal.go
47 lines (43 loc) · 1.4 KB
/
145.postorderTraversal.go
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
package tree
import (
"Leetcode/algorithms/kit"
)
// postorderTraversal 基于栈的后序遍历
// 后序遍历顺序:左->右->根,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点
// 步骤:后序遍历左子树 -> 后序遍历右子树 -> 根节点,遍历左右子树时仍然采用后序遍历方法
// 如以下二叉树:
// A
// B C
// D E F NULL
// 前序遍历:ABDECF 中序遍历:DBEAFC 后序遍历:DEBFCA
// 时间复杂度:O(n), 空间复杂度:O(n)
funcpostorderTraversal(root*TreeNode) []int {
varres []int
ifroot==nil {
returnres
}
// 保存最近访问的一个的根节点,用于判断当前是从左子树到的根节点还是右子树到的根节点
// 如果当前节点的右节点和上一次遍历的节点相同,那就表明当前是从右节点过来的了
varlatest*TreeNode=nil
stack:=kit.NewStack()
forroot!=nil||!stack.IsEmpty() {
ifroot!=nil {
// 与中序遍历一样,都需要先找到左子树的leaf节点
stack.Push(root)
root=root.Left
} else {
// curr node
curr:= (stack.Peek()).(*TreeNode)
// fmt.Printf("curr:%v latest:%v\n", curr, latest)
// 是否变到右子树
ifcurr.Right!=nil&&curr.Right!=latest {
root=curr.Right
} else {
res=append(res, curr.Val)
latest=curr
stack.Pop()
}
}
}
returnres
}