题目理解
给定一个二叉树,返回它的 后序 遍历。
二叉树的后序遍历的意思其实就是将节点进行 左-->右-->根 的方式进行输出。
思路分析
前面我们进行过递归形式的题解的处理,指路如下[路飞]leetcode-递归调用解决二叉树的遍历
下面进行思路分析:
我们需要定义三个变量,ans: 最终得到的返回结果 、s1:递归中的临时变量的值、s2:程序状态&递归到的程序的位置,
while循环,当s1不为空,程序状态分为0、1、2,0为左子树、1为右子树、2为根节点。
每次到左子树,则根据是否还有左子树来最终决定程序状态,并且判断是否将值追加进入s1
每次到右子树,同样根据是否还有右子树来最终确定程序状态,并且判断是否将值追加进入s1
每次到根节点,则从s1栈顶取出最顶部元素放入最终返回结果中。
依次进行处理,直至程序完成。
动图分析
代码实现
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;
};
其他相关说明
递归法与迭代法其实运行的意思是差不多的只是表现形式不太一样,理论上来讲,我们所有的递归方法实现,都可以使用迭代法来进行不同形式的代码书写,如果想要提高自己的代码水平,这样子的锻炼是少不了的哦~~~