leetcode每天5题-Day40(二叉树2-层序遍历)

续Day36
二叉树第二弹-层序遍历专项

1.二叉树的层序遍历

102. 二叉树的层序遍历-中等
b站视频-代码随想录

相当于图论中的广度优先搜索。

var levelOrder = function(root) {
    const queue = [];
    const ans = [];
    if(root) queue.push(root);
    while(queue.length) {
        //  size存放每层的节点个数
        let size = queue.length;  
        //  把每层节点放进
        let temp = [];
        while(size--){
            let node = queue.shift();
            temp.push(node.val);
            if(node.left) queue.push(node.left);
            if(node.right) queue.push(node.right);
        }
        ans.push(temp);
    }
    return ans;
};

2.二叉树的层序遍历 II

107. 二叉树的层序遍历 II-中等
自底向上的层序遍历

var levelOrderBottom = function(root) {
    const queue = [];
    const ans = [];
    if(root) queue.push(root);
    while(queue.length) {
        //  size存放每层的节点个数
        let size = queue.length;  
        //  把每层节点放进
        let temp = [];
        while(size--){
            let node = queue.shift();
            temp.push(node.val);
            if(node.left) queue.push(node.left);
            if(node.right) queue.push(node.right);
        }
        // ans.push(temp);
        // 从数组前头插入值,避免最后反转数组,减少运算时间
        ans.unshift(temp);
    }
    return ans;
};

3.二叉树的右视图

199. 二叉树的右视图-中等

var rightSideView = function(root) {
    const queue = [];
    const ans = [];
    if(root) queue.push(root);
    while(queue.length) {
        // 记录当前层 节点个数
        let size = queue.length;
        while(size){
            let node = queue.shift();
            if(size === 1){
                ans.push(node.val);
            }
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
            size--;
        }
    }
    return ans;
};

4.二叉树的层平均值

637. 二叉树的层平均值-简单

var averageOfLevels = function(root) {
    //层级平均值
    let res=[],queue=[];
    queue.push(root);
    while(queue.length&&root!==null){
        //每一层节点个数
        let length=queue.length;
        //sum记录每一层的和
        let sum=0;
        for(let i=0;i<length;i++){
            let node=queue.shift();
            sum+=node.val;
            node.left&&queue.push(node.left);
            node.right&&queue.push(node.right);
        }
        //每一层的平均值存入数组res
        res.push(sum/length);
    }
    return res;
};

5.N 叉树的层序遍历

429. N 叉树的层序遍历-中等
利用node.children

var levelOrder = function(root) {
    const queue = [], ans = [];
    if(root) queue.push(root);
    while(queue.length) {
        let size = queue.length;
        let temp = [];
        while(size--) {
            let node = queue.shift();
            for(let i of node.children) {
                queue.push(i);
            }
            temp.push(node.val);
        }
        ans.push(temp);
    }
    return ans;
};

6.在每个树行中找最大值

515. 在每个树行中找最大值-中等

var largestValues = function(root) {
    const queue = [], ans = [];
    if(root) queue.push(root);
    while(queue.length){
        let size = queue.length;
        //  可以把temp设置为队列中第一个元素   let temp = queue[0].val;
        let temp = - Number.MAX_VALUE;
        while(size--){
            let node = queue.shift();
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
            temp = Math.max(node.val,temp);
            
        }
        ans.push(temp)
    }
    return ans;
};

7.填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针-中等

因为初始状态下,所有 next 指针都被设置为 NULL。所以我们不用对最右侧节点做操作,即不用赋NULL,因此就需要对size做判断。

var connect = function(root) {
    const queue = [];
    if(root) queue.push(root);
    while(queue.length) {
        let size = queue.length;
        while(size--) {
            let node = queue.shift();
            //  需要对size做个判断
            if(size > 0){
                node.next = queue[0];
            }
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
    }
    return root;
};

8.填充每个节点的下一个右侧节点指针 II

117. 填充每个节点的下一个右侧节点指针 II-中等
跟上一题同样的逻辑,但不知道为什么报错
2022.11.20更新:又看一遍这道题,换了另一个题解,还是报错。去题解中的评论区看了一下,好像是JS的解法就会抛出异常
在这里插入图片描述

9.二叉树的最大深度

104. 二叉树的最大深度-简单

层序遍历统计

var maxDepth = function(root) {
// 不用ans   定义height  后面每遍历一层 height++即可
    const queue = [], ans = [];
    if(!root) return 0;
    queue.push(root);
    while(queue.length) {
        let size = queue.length;
        let temp = [];
        while(size--) {
            let node = queue.shift();
            temp.push(node.val);
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
        ans.push(temp);
    }
    return ans.length;
};

递归

var maxDepth = function(root) {
    const getDepth = function(root) {
        if(!root) return 0;
        return Math.max(getDepth(root.left), getDepth(root.right)) + 1;
    }
    return getDepth(root);
};

10.二叉树的最小深度

111. 二叉树的最小深度-简单

当左右孩子同时为空时就说明遍历到叶子节点了,就直接返回此时的高度即可

var minDepth = function(root) {
    if(!root) return 0;
    const queue = [root];
    let height = 0;
    while(queue.length) {
        height++;
        let size = queue.length;
        while(size--) {
            let node = queue.shift();
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
            if(!node.left && !node.right) {
                return height;
            }
        }
         
    }
    return height;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值