LeetCode 二叉树前中后序//11.17Cloudy

除了前中后序,还有层序遍历,在之前的文章里写过,用的BFS+队列。

而对于前中后序遍历,常见的有两种方法:递归和迭代。

144

二叉树的前序遍历  

100168.5%中等
145

二叉树的后序遍历  

88273.5%中等
94

二叉树的中序遍历  

119374.1%中等
102

二叉树的层序遍历   

145263.7%中等

 

1.前序遍历

①递归:

var preorderTraversal = function(root) {
    let res = []
    var dfs = function(root) {
        if (!root) return;
        res.push(root.val);
        dfs(root.left);
        dfs(root.right);
    }
    dfs(root);
    return res;
};

注意递归的终止条件,最后return;或者return res;都行

对于中序和后序,区别只在于dfs函数内部三行代码的先后顺序。下面来看一下迭代法。

②迭代+栈:

学习于https://www.bilibili.com/video/BV15K4y1Y7Gz?from=search&seid=2301269158871100139

相当于DFS,先搜索完左下角,再逐渐往右搜索。

var preorderTraversal = function(root) {
    if(!root) return[];
    let res =[];
    let stack = [];
    while (root || stack.length > 0) {
        while(root){
            res.push(root.val);
            stack.push(root);
            root = root.left;
        }
        let cur = stack.pop();
        root = cur.right;
    }
    return res;
};

注意stack.length > 0这里,不能用stack !== [],js里空数组的判断很怪,之前博客说过。

2.后序遍历

①递归:略

②迭代+栈:

前序是根左右,后序是左右根,相当于根右左.reverse(),所以对调前序遍历的left和right即可。

这样相当于有了模板,很巧妙。

var postorderTraversal = function(root) {
    if(!root) return[];
    let res =[];
    let stack = [];
    while (root || stack.length > 0) {
        while(root){
            res.push(root.val);
            stack.push(root);
            root = root.right;
        }
        let cur = stack.pop();
        root = cur.left;
    }
    return res.reverse();
};

3.中序遍历

①递归:略

②迭代+栈:

中序不能完全照搬刚刚的模板,因为前序和后序在刚刚的过程中都相当于进栈的过程中压入res(根左右,根右左.reverse()),而中序时,是左根右,要出栈的时候压入res:

var inorderTraversal = function(root) {
    let stack = [];
    let res = [];
    while(root || stack.length !== 0) {
        while(root) {
            stack.push(root);
            root = root.left;    
        }
        let node = stack.pop();
        res.push(node.val);
        root = node.right;
    }
    return res;
};

总结:

这三种遍历的两种方法,递归和迭代,都有模板。

递归三行。

迭代的核心代码只有五行,只需变动位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值