| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | 
							- package main
 
- /**
 
-  * Definition for a binary tree node.
 
-  * type TreeNode struct {
 
-  *     Val int
 
-  *     Left *TreeNode
 
-  *     Right *TreeNode
 
-  * }
 
-  */
 
- func postorderTraversal(root *TreeNode) (nodes []int) {
 
- 	if root == nil {
 
- 		return
 
- 	}
 
- 	return postorderIteration(root)
 
- }
 
- func postorderRecurse(root *TreeNode, nodes *[]int) {
 
- 	if root == nil {
 
- 		return
 
- 	}
 
- 	postorderRecurse(root.Left, nodes)
 
- 	postorderRecurse(root.Right, nodes)
 
- 	*nodes = append(*nodes, root.Val)
 
- }
 
- func postorderIteration(root *TreeNode) (nodes []int) {
 
- 	stack := make([]*TreeNode, 0)
 
- 	for curr := root; ; {
 
- 		for curr != nil {
 
- 			if curr.Right != nil {
 
- 				stack = append(stack, curr.Right)
 
- 			}
 
- 			stack = append(stack, curr)
 
- 			curr = curr.Left
 
- 		} // Save right, root; visit left (the right node is saved to mark root.Right as unvisited)
 
- 		// curr is nil, pop top of stack
 
- 		curr = stack[len(stack)-1]
 
- 		stack = stack[:len(stack)-1]
 
- 		// If right is not visited, pop right, save root again, and visit right
 
- 		if curr.Right != nil && len(stack) != 0 && curr.Right == stack[len(stack)-1] {
 
- 			stack = stack[:len(stack)-1]
 
- 			stack = append(stack, curr)
 
- 			curr = curr.Right
 
- 		} else { // Else print root
 
- 			nodes = append(nodes, curr.Val)
 
- 			curr = nil
 
- 		}
 
- 		if len(stack) == 0 {
 
- 			break
 
- 		}
 
- 	}
 
- 	return
 
- }
 
- // func main() {
 
- // 	fmt.Println(postorderTraversal(
 
- // 		toBinaryTree(newInt(1), nil, newInt(2), newInt(3))))
 
- // }
 
 
  |