二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
后续遍历,就是先输出左数,再输出右树,最后输出中树
假设有这样的一个二叉树
我们需要先输出left-left再输出left-right再输出left再......
那么我们先思考递归的方法实现的方法,传进来树根,先判断是否有left,如果有,则再判断left下面是否有left-left,所以我们需要定义一个函数,来寻找子树,当没有子树了,获取树.val,push到我们的变量中
递归代码
// 递归
var postorderTraversal = function (root) {
// 定义一个数组,存放将要遍历的值
let msg = [];
// 把树根和数组给到我们的寻找子树的方法中
return getval(root, msg);
};
var getval = function (list, msg) {
// 当传进来的树有值,进入if
if (list) {
// 把树的左子树和数组传入寻找子树方法中
getval(list.left, msg);
// 把树的右子树和数组传入寻找子树方法中
getval(list.right, msg);
// 当左右子树都记录完了,最后记录树根的val
msg.push(list.val);
}
return msg;
};
套入我们假设的二叉树
return getval(树根,[])
然后进入if,if中又调用getval
getval(left, []);
left还有左子树,所以当第二次进入if中时,还会调用一次
getval(left-left, []);
然后left-left进入getval中,因为left-left没有子树了,所以进入if后,只能把它的值push进msg中
当我们的代码走完left-left时,msg的情况是msg['left-left']
然后我们走完left-right时,msg的情况是msg['left-left','left-right']
当我们走完所有流程时
msg的情况是msg['left-left','left-right','left','right-right','right','树根']
符合后序遍历,return
迭代代码
var postorderTraversal = function (root) {
// 定义一个数组,存放将要遍历的值
let res = [];
// 当传进来的值为空,直接return
if (!root) return res;
// 不空再定义一个stack,存放传进来的树根
let stack = [root];
// 进入while循环
while (stack.length) {
// stack把最后一个值pop掉,赋值给root,用来判断是否有子树,以便接下来的操作
root = stack.pop();
// 在首位插入此树的val
res.unshift(root.val);
// 当此树有子树,存入stack中,进行下一次的循环
if (root.left) stack.push(root.left);
if (root.right) stack.push(root.right);
}
// 循环结束,return
return res;
};
迭代思路
如下图解