(1)方法一:递归
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型ArrayList
*/
ArrayList<Integer> list = new ArrayList<>(); //注意:放在后序遍历函数外面
public ArrayList<Integer> postorderTraversal (TreeNode root) {
if(root!=null){
postorderTraversal(root.left);
postorderTraversal(root.right);
list.add(root.val);
}
return list;
}
}
(2)方法二:非递归
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型ArrayList
1
2 3
思路:前序:1 2 3 -> 1 3 2(左右孩子交换)-> 2 3 1(逆序) 等价于后序
后序:2 3 1
故:1.我们只需对该二叉树进行前序遍历,1 2 3 (将结点入栈1)
2. 然后将其左右孩子交换,1 3 2 (取出栈1的结点放入栈2 ,并将取出结点的左右孩子放入栈1)
3. 再获取逆序 2 3 1 (取出栈2的结点,完成逆置)
*/
int MAXSIZE=1000;
ArrayList<Integer> list = new ArrayList<>(); //存放遍历结果。
TreeNode s1[] = new TreeNode[MAXSIZE];//栈1(树节点类型)
TreeNode s2[] = new TreeNode[MAXSIZE];//栈2(树节点类型)
int top1=-1;
int top2=-1;
public ArrayList<Integer> postorderTraversal (TreeNode root) {
if(root==null){
return list;
}
s1[++top1] = root;
while(top1!=-1){
TreeNode p = s1[top1--]; //将s1的结点出栈,入栈2
s2[++top2] = p;
if(p.left!=null){//出栈结点的左孩子不为空,入栈1
s1[++top1] = p.left;
}
if(p.right!=null){//出栈结点的右孩子不为空,入栈1
s1[++top1] = p.right;
}
}//while
while(top2!=-1){//将栈2中的结点出栈
list.add(s2[top2--].val);
}//while
return list;
}
}