每日一题:LeetCode之二叉树非递归后续遍历

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]

       1
         \
          2
         /
        3

输出: [3,2,1]

本文使用迭代法实现二叉树的遍历,对于当前节点,其左孩子和右孩子都被访问之后,才能访问当前节点。我们可以使用pre指向上一次访问的节点,若当前节点的左右孩子都访问过,则访问当前节,否则继续向孩子节点遍历。我们使用辅助栈来实现。

public List<Integer> postorderTraversal(TreeNode root) {


        Stack<TreeNode> stack =new Stack();
        List<Integer> list=new ArrayList();

        TreeNode cur=root;
        TreeNode pre=null;
        while(!stack.isEmpty()||cur!=null){
            while(cur!=null){   //找到节点的最左边节点
                stack.push(cur);
                cur=cur.left;
            }
            cur=stack.pop();   //无左孩子弹出栈顶节点
            
            if(cur.right==null||cur.right==pre){ // 判断栈顶节点的右孩子是否被访问过或者为空
                list.add(cur.val);
                pre=cur;
                cur=null;
            }else{           //没有访问过,将弹出的栈顶重新入栈  当前节点指向右孩子
                stack.push(cur);
                cur=cur.right;
            }
        }
        return list;
    }
发布了28 篇原创文章 · 获赞 0 · 访问量 360

猜你喜欢

转载自blog.csdn.net/qq_40053995/article/details/105391613