题目来源
我的题解
方法一 递归方式
按照访问左子树——右子树——根节点的方式遍历这棵树,而在访问左子树或者右子树的时候,按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,可以直接用递归函数来模拟这一过程。
时间复杂度:O(n)
空间复杂度:O(n)
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
if(root==null)
return res;
postOrder(root,res);
return res;
}
public void postOrder(TreeNode root,List<Integer> res){
if(root==null)
return ;
postOrder(root.left,res);
postOrder(root.right,res);
res.add(root.val);
}
方法二 非递归方式
自己使用栈实现递归栈
时间复杂度:O(n)
空间复杂度:O(n)
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
if(root==null)
return res;
LinkedList<TreeNode> stack=new LinkedList<>();
stack.push(root);
//记录前驱节点
TreeNode pre=null;
while(!stack.isEmpty()){
TreeNode cur=stack.peek();
// 输出结果的情况
//叶子节点 当前节点的所有节点已经遍历完了
if((cur.left==null&&cur.right==null)||(pre!=null&&(cur.left==pre||cur.right==pre))){
cur=stack.pop();
res.add(cur.val);
pre=cur;
}else{
//同理,需要先右后左
if(cur.right!=null)
stack.push(cur.right);
if(cur.left!=null)
stack.push(cur.left);
}
}
return res;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~