# 145. Post-order traversal recursive solution and non-recursive solution of binary tree

Given a binary tree, return its post-order traversal.

Example:

```
输入: [1,null,2,3]
1
\
2
/
3
```

Output: [3,2,1]

Advanced: The recursive algorithm is very simple, can you do it through an iterative algorithm?

# Solution 1: Recursion

```
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
postorderTraversal(root,list);
return list;
}
public void postorderTraversal(TreeNode root, List<Integer> list) {
if (root==null){
return;
}
postorderTraversal(root.left,list);
postorderTraversal(root.right,list);
list.add(root.val);
}
```

# Solution 2: Iteration

## template

The traversal of the binary tree can be thought of based on this template. On this basis, you can always think about it carefully.

```
while( 栈非空 || p 非空)
{
if( p 非空)
{
}
else
{
}
}
```

## Problem-solving ideas

1. Set node=root

2. If the node is a leaf node or the left and right nodes of the node have been visited, the element is accessed and popped,

otherwise the right and left nodes of the node are pushed into the stack in turn

```
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> list = new LinkedList<>();
if (root==null){
return list ;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode node=root;
TreeNode pre=null;
while (!stack.isEmpty()||node!=null){
if (node!=null){
stack.add(node);
node=node.left;
}else{
node = stack.peek();
/*如果当前节点的右节点为空获取右节点已经被访问过了*/
if(node.right == null || node.right == pre)
{
list.add(node.val);
pre = node;
stack.pop();
/*将node置为null取出下一个栈顶节点*/
node = null;
}
else{
node = node.right;
}
}
}
return list;
}
```