package main
import (
tree "awesomeProject/interview/Tree"
"fmt"
)
func postorderTraversal(root *tree.Node) []int {
if root == nil {
return nil
}
result := make([]int, 0)
stack := make([]*tree.Node, 0)
var lastVisit *tree.Node //弹出过的节点,保证根节点必须在右节点弹出之后再弹出
for root != nil || len(stack) != 0 {
for root != nil {
//所有的左节点入栈
stack = append(stack, root)
root = root.Left
}
//处理右节点和根节点
node := stack[len(stack)-1]
//如果没有右节点或者是右节点已经弹出过了,压入结果
if node.Right == nil || node.Right == lastVisit {
stack = stack[:len(stack)-1]
result = append(result, node.Val)
lastVisit = node
} else {
//如果有右节点且没有弹出过,直接往右走
root = node.Right
}
}
return result
}
func main() {
/*
1
/\
2 3
/\ /\
4 56 7
*/
root := tree.NewNode(1)
left1 := tree.NewNode(2)
right1 := tree.NewNode(3)
root.Left = left1
root.Right = right1
left2 := tree.NewNode(4)
right2 := tree.NewNode(5)
left1.Left = left2
left1.Right = right2
left3 := tree.NewNode(6)
right3 := tree.NewNode(7)
right1.Left = left3
right1.Right = right3
fmt.Println(postorderTraversal(root)) //[4 5 2 6 7 3 1]
}