[路飞]leetcode145.迭代法进行二叉树的后序遍历

363 阅读2分钟

题目理解

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

二叉树的后序遍历的意思其实就是将节点进行 左-->右-->根 的方式进行输出。

思路分析

前面我们进行过递归形式的题解的处理,指路如下[路飞]leetcode-递归调用解决二叉树的遍历

下面进行思路分析:

我们需要定义三个变量,ans: 最终得到的返回结果 、s1:递归中的临时变量的值、s2:程序状态&递归到的程序的位置,

while循环,当s1不为空,程序状态分为0、1、2,0为左子树、1为右子树、2为根节点。

每次到左子树,则根据是否还有左子树来最终决定程序状态,并且判断是否将值追加进入s1

每次到右子树,同样根据是否还有右子树来最终确定程序状态,并且判断是否将值追加进入s1

每次到根节点,则从s1栈顶取出最顶部元素放入最终返回结果中。

依次进行处理,直至程序完成。

动图分析

二叉树后序遍历迭代法.gif

代码实现


var postorderTraversal = function (root) {
    if (!root) return [];
    const ans = [];
    const s1 = []; // 递归中的值
    const s2 = []; // 程序状态

    s1.push(root);
    s2.push(0);

    while (!(s1.length === 0)) {
        const status = s2.pop();
        const len = s1.length;
        switch (status) {
            case 0:
                s2.push(1);
                const left = s1[len - 1].left;
                if (left) {
                    s1.push(left);
                    s2.push(0);
                }
                break;
            case 1:
                s2.push(2);
                const right = s1[len - 1].right;
                if (right) {
                    s1.push(right);
                    s2.push(0);
                }
                break;
            case 2:
                ans.push(s1.pop().val);
                break;
        }
    }

    return ans;
};

其他相关说明

递归法与迭代法其实运行的意思是差不多的只是表现形式不太一样,理论上来讲,我们所有的递归方法实现,都可以使用迭代法来进行不同形式的代码书写,如果想要提高自己的代码水平,这样子的锻炼是少不了的哦~~~