求给定的二叉树的后序遍历。

binary-tree-postorder-traversal

http://www.nowcoder.com/questionTerminal/32af374b322342b68460e6fd2641dd1b

如果是前序遍历,我们的顺序是根节点,左节点,右节点。如果我们用一个栈来实现,可以这样考虑:先把根节点压入栈,在栈中有元素的时候循环:每次弹出栈顶元素,然后先压入栈顶元素的右边节点,再压入栈顶元素的左边节点。
因为栈是先进后出,因此要先压入右边的节点,因此第二次执行while循环的时候,栈顶元素就是左节点A,然后再来压入右节点A->R压入左节点A->L,注意,下一次循环的时候,谁是栈顶元素?没错,就是左节点。就是通过这种栈的特性,实现了递归的过程!
所以要能够理解,为什么有人说栈和递归是一样的。
以上过程实现了根、左、右的遍历过程,那我们想想后序遍历:左、右、根的的顺序,可不可以借鉴这个思路?可以的,我们只需要实现根、右、左的过程,再reverse一下,就OK了,是不是很骚,是的。
————————————————
原文链接:https://blog.csdn.net/ibelieve8013/article/details/103059101

import java.util.*;
public class Solution {
    private ArrayList<Integer> list = new ArrayList<>();
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        //迭代法 ,先实现根 右 左 再reverse
        //递归的本质就是栈
        if (root == null) return list;
        Stack<TreeNode> stk = new Stack<>();
        stk.push(root);
        while(!stk.isEmpty()){
            //栈顶出来
            TreeNode top = stk.pop();
            list.add(top.val);
            //压入左再压入右--->我们访问的顺序就是根 右 左
            if(top.left != null) stk.push(top.left);
            if(top.right!=null) stk.push(top.right);
        }
        Collections.reverse(list);
        return list;

    }
}
全部评论
哈哈 是的
点赞 回复 分享
发布于 2021-08-13 10:24

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
11 收藏 评论
分享
牛客网
牛客企业服务