【五月集训】第十七天打卡(广度优先搜索)

本文介绍了三种与树形结构相关的算法问题:LCP44问题利用广搜计算节点值出现次数;102题实现二叉树的层序遍历;1609题检查树的奇偶性质。通过广度优先搜索策略,分别解决了节点值统计、层次遍历和奇偶层节点值验证的问题。
摘要由CSDN通过智能技术生成


LCP 44. 开幕式焰火

题目链接

开幕式焰火

思路

  • 利用广搜并对于扩展出的节点放入哈希表
  • 题意可知范围在1——1000,枚举这个范围,如果此值在哈希表中有记录,计数sum+1

题解

function numColor(root: TreeNode | null): number {
    let hash = {}
    function transfer(root) {
        if (root) {
            hash[root.val] = 1
            transfer(root.left)
            transfer(root.right)
        }
    }
    let i: number, sum = 0
    transfer(root)
    for (i = 1; i <= 1000; i++) {
        if (hash[i]) ++sum
    }
    return sum
};

102. 二叉树的层序遍历

题目链接

二叉树的层序遍历

思路

  • 先将根节点塞入数组中
  • 根据深度来选择放入结果数组的哪一层

题解

function levelOrder(root: TreeNode | null): number[][] {
    const ret = [];
    if (!root) {
        return ret;
    }

    const q = [];
    q.push(root);
    while (q.length !== 0) {
        const currentLevelSize = q.length;
        ret.push([]);
        for (let i = 1; i <= currentLevelSize; ++i) {
            const node = q.shift();
            ret[ret.length - 1].push(node.val);
            if (node.left) q.push(node.left);
            if (node.right) q.push(node.right);
        }
    }
    return ret;
};

1609. 奇偶树

题目链接

奇偶树

思路

在上面一道题得到结果后,先判断结果数组是否满足奇数索引里面的值都为偶数,偶数索引值都为奇数,且:

  • 偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增
  • 奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减

题解

function isEvenOddTree(root: TreeNode | null): boolean {
    const ret = [];
    if (!root) {
        return false;
    }

    const q = [];
    q.push(root);
    while (q.length !== 0) {
        const currentLevelSize = q.length;
        ret.push([]);
        for (let i = 1; i <= currentLevelSize; ++i) {
            const node = q.shift();
            ret[ret.length - 1].push(node.val);
            if (node.left) q.push(node.left);
            if (node.right) q.push(node.right);
        }
    }
    for (let i = 0; i < ret.length; i++) {
        if (i & 1) {
            //偶数,严格递减
            for (let j = 0; j < ret[i].length; ++j) {
                if ((ret[i][j] & 1) || (j && ret[i][j] >= ret[i][j - 1])) {
                    return false
                }
            }
        } else {
            // 奇数,单调递增
            for (let j = 0; j < ret[i].length; ++j) {
                if (!(ret[i][j] & 1) || (j && ret[i][j] <= ret[i][j - 1])) {
                    return false
                }
            }
        }
    }
    return true;
};
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值