二叉树的后序遍历

136 阅读2分钟

二叉树的后序遍历

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

示例:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [3,2,1]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

后续遍历,就是先输出左数,再输出右树,最后输出中树

假设有这样的一个二叉树

1.png

我们需要先输出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后,只能把它的值pushmsg

当我们的代码走完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;
};

迭代思路

如下图解

1.png

2.png

3.png

4.png

5.png