[路飞]-leetcode 二叉树前序、中序遍历

144 阅读2分钟

我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

解法一:递归
var inorderTraversal = function(root, res = []) {
    if(!root)return res
    // 我们需要遍历的顺序是 左 根节点 右
    inorderTraversal(root.left, res)
    res.push(root.val)
    inorderTraversal(root.right, res)
    return res
}

递归解法我们需要将res保存一下临时结果。最终返回,所以需要作为参数不断传入。

解法二:迭代
var inorderTraversal = function(root) {
    // 判断边界
    if(!root) return []
    var res = [], stack = []
    
    // 这些节点又不急于放到遍历结果中,这里我们需要栈来保存节点这里我们需要栈来保存节点
    while(stack.length || root){
        while(root){ 
            // 先根节点后左子树入栈
            stack.push(root)
            root = root.left   
        }
        // 此时root=null 说明上一步没有左子树
        // 1. 执行左出栈 此时root = null ,导致root.right 一定为空
        // 2. 执行下次外层循环,根出栈,此时root.right可能存在
        // 3. 若有right ,右入栈在出栈
        // 4. 若right 不存在则重复2步骤
        root = stack.pop() 
        res.push(root.val) 
        root = root.right 
    }
    return res
};

144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

解法一:递归
var inorderTraversal = function(root, res = []) {
    if(!root)return res
    // 我们需要前序遍历的顺序是  根节点 左 右
    res.push(root.val)
    inorderTraversal(root.left, res)
    inorderTraversal(root.right, res)
    return res
}

解法二 迭代法
var preorderTraversal = function(root) {
    if(root==null)return []
    var res = [], stack= []
    // 当栈为空或节点不存在时停止循环
    while(stack.length || root){
         // 先根后左子树入栈
        while(root){
            res.push(root.val)
            stack.push(root)
            root = root.left
        }
        // 1. 此时root = null, 说明一定没有左子树,并且root.right一定不存在
        // 2. 接着执行下一次外层循环,根出栈,此时root.right 可能存在
        // 3. 若root.right存在 先入栈 后出栈
        // 4. 若root.right不存在 则继续第2个步骤
        root = stack.pop()
        root = root.right
    }
    return res
};
相关文章

二叉树后序遍历

结束语

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~