二叉树的前、中、后序迭代方式遍历统一模板(模拟函数栈)

class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Deque<Frame> stack = new ArrayDeque<>();
        // 首次进入函数
        stack.add(new Frame(root, 0));
        // 开始递归
        while(!stack.isEmpty()){
            Frame cur = stack.peek();
            TreeNode treeNode = cur.treeNode;
            // 递归终止条件
            if(treeNode == null){
                stack.pop();
                continue;
            }
            // 递归函数体
            switch (cur.step){
                case 0:{// 步骤一
                    stack.push(new Frame(treeNode.left, 0));
                    break;
                }
                case 1:{// 步骤二
                    consume(res, treeNode);// 中序遍历;前序遍历可将此步骤与步骤一交换;后序遍历同理
                    break;
                }
                case 2:{// 步骤三
                    stack.push(new Frame(treeNode.right, 0));
                    break;
                }
                case 3:{// 退出当前函数体
                    stack.pop();
                    break;
                }
            }
            cur.step++;// 当前步骤执行结束,到下一个步骤
        }
        return res;
    }
    /**
     * 处理节点
     */
    private void consume(List<Integer> res, TreeNode treeNode) {
        res.add(treeNode.val);
    }
    /**
     * 模拟函数栈帧;treeNode 为数据,step 为函数执行位置
    private static class Frame {
        TreeNode treeNode;
        int step;

        public Frame(TreeNode treeNode, int step) {
            this.treeNode = treeNode;
            this.step = step;
        }
    }
}    

全部评论

相关推荐

找到实习了&nbsp;给了150一天&nbsp;但是说是低代码&nbsp;值得去吗
码农索隆:是在没实习,可去,待个一两周,不行就润呗
点赞 评论 收藏
分享
05-29 09:02
门头沟学院 Java
点赞 评论 收藏
分享
ZywOo_求职版:谁问你了....
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 10:39
一个证都没&nbsp;我能填什么
程序员小白条:别人有,你为什么没有,还是这个道理,社会就是比较,竞争,淘汰,你要安逸,那么就要做好淘汰的准备
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务