原題鏈接:https://leetcode.com/problems/binary-tree-postorder-traversal/
難度:hard
解法:二叉樹的后序遍歷,左孩子 -》右孩子-》父節(jié)點(diǎn)。挺簡單的,不知道為啥算是hard難度。
編程語言:golang
遞歸版實(shí)現(xiàn):
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func postorderTraversal(root *TreeNode) []int {
var result []int
if root == nil {
return result
}
if root.Left != nil {
r := postorderTraversal(root.Left)
for _, ele := range r {
result = append(result, ele)
}
}
if root.Right != nil {
r := postorderTraversal(root.Right)
for _, ele := range r {
result = append(result, ele)
}
}
return append(result, root.Val)
}
非遞歸版實(shí)現(xiàn):利用兩個(gè)棧來完成后續(xù)遍歷。go沒有內(nèi)建的stack也是挺煩的,pop操作,一行代碼變兩行了。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func postorderTraversal(root *TreeNode) []int {
var result []int
if root == nil {
return result
}
var s1 []*TreeNode
var s2 []*TreeNode
s1 = append(s1, root);
for len(s1) > 0 {
// use slick to do stack pop operation
n := s1[len(s1) - 1]
s1 = s1[0:len(s1) - 1]
if n.Left != nil {
s1 = append(s1, n.Left);
}
if n.Right != nil {
s1 = append(s1, n.Right);
}
s2 = append(s2, n);
}
for len(s2) > 0 {
// pop the header of s2
n := s2[len(s2) - 1]
s2 = s2[0:len(s2) - 1]
result = append(result, n.Val)
}
return result
}
非遞歸版實(shí)現(xiàn),看起來時(shí)間和內(nèi)存占用都還不錯(cuò):
Runtime: 0 ms, faster than 100.00% of Go online submissions for Binary Tree Postorder Traversal.
Memory Usage: 2 MB, less than 100.00% of Go online submissions for Binary Tree Postorder Traversal.