给定一个二叉树,返回它的 后序 遍历。
- 这种题算经典题了,递归很好写,那么迭代呢,其实也很好写。
public class _145 {
//递归版本 左右根顺序
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans=new ArrayList<>();
dfs(ans,root);
return new ArrayList<>(ans);
}
public void dfs(List<Integer> ans,TreeNode treeNode){
if(treeNode==null){
return;
}
if(treeNode.left!=null){
dfs(ans,treeNode.left);
}
if(treeNode.right!=null){
dfs(ans,treeNode.right);
}
ans.add(treeNode.val);
}
//迭代版本
//迭代的话,就利用栈来模拟,左右根的话 在栈中的顺序就是根右左
public static List<Integer> postorderTraversal1(TreeNode root) {
if(root==null){
return new ArrayList<>();
}
List<Integer> ans=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
stack.add(root);
while (!stack.isEmpty()){
TreeNode cur=stack.pop();
if(cur.left==null&&cur.right==null){ //左右结点都为空则添加到list中
ans.add(cur.val);
continue;
}
stack.push(new TreeNode(cur.val));//直接添加新的结点 新建TreeNode
if(cur.right!=null){ //添加右边
stack.push(cur.right);
}
if(cur.left!=null) { //添加左边
stack.push(cur.left);
}
}
return ans;
}
}