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

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

全部评论

相关推荐

查看36道真题和解析 软件开发2024笔面经
点赞 评论 收藏
转发
头像
不愿透露姓名的神秘牛友
05-11 18:19
1.&nbsp;简述多态实现的原理。2.&nbsp;链表和数组有什么区别?3.&nbsp;简述队列和栈的异同。4.&nbsp;&amp;&amp;和&amp;、||和|有什么区别?5.&nbsp;C++的引用和C语言的指针有什么区别?6.&nbsp;typedef和define有什么区别?7.&nbsp;关键字const是什么?8.&nbsp;static有什么作用?9.&nbsp;extern有什么作用?10.&nbsp;流操作符重载为什么返回引用?11.&nbsp;简述指针常量与常量指针的区别。12.&nbsp;如何避免&quot;野指针&quot;?13.&nbsp;常引用有什么作用?14.&nbsp;构造函数能否为虚函数?15.&nbsp;关键字volatile有什么含意(举例说明)?16.&nbsp;程序什么时候应该使用线程,什么时候单线程效率高?17.&nbsp;Linux有内核级线程吗?18.&nbsp;C++中什么数据分配在栈或堆中,new分配数据是在近堆还是远堆中?19.&nbsp;使用线程是如何防止出现大的波峰?20.&nbsp;函数模板与类模板有什么区别?21.&nbsp;动态连接库的两种方式?22.&nbsp;什么是平衡二叉树?23.&nbsp;冒泡排序算法的时间复杂度是什么?24.&nbsp;C和C++中的struct有什么不同?25.&nbsp;用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。26.&nbsp;不能做switch()的参数类型是?27.&nbsp;全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?28.&nbsp;8086是多少位的系统?在数据总线上是怎么实现的?29.&nbsp;局部变量能否和全局变量重名?30.&nbsp;结构传递和返回是如何实现的?为什么sizeof返回的值大于结构大小的期望值,是不是尾部都有填充?答案在面经中&nbsp;&nbsp;c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
查看30道真题和解析
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务