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

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;
        }
    }
}    

全部评论

相关推荐

FieldMatching:看成了猪头顾问,不好意思
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务