想要精通算法和SQL的成长之路 - 最小高度树

news2024/12/28 5:45:57

想要精通算法和SQL的成长之路 - 最小高度树

  • 前言
  • 一. 最小高度树
    • 1.1 邻接表的构建
    • 1.2 入度为1的先入队
    • 1.3 BFS遍历

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 最小高度树

原题链接
在这里插入图片描述

从题目的含义中我们可以发现:

  • 题目的树是一颗多叉树。
  • 叶子节点的度为1,而非叶子节点的度至少是2(多叉树)
  • 树的高度由根节点到叶子节点的最大距离决定。

题目要求返回根节点列表,那么我们很难自上而下的遍历。那么不妨我们从叶子节点入手,自下而上的遍历呢?

  • 我们构建邻接表和一个度数组。
  • 我们把度为1的节点(叶子节点)入队。
  • 每层遍历,把队列中的节点移除,并根据邻接表拿到他们的相邻节点。并且更新他们的度(-1),若度在减1之后,为1,继续把他们丢到队列,进入下一层循环。
  • 那么最终留下来的就是根节点列表。

1.1 邻接表的构建

// 构建邻接表和出度数组
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i < n; i++) {
    adj.add(new ArrayList<>());
}
int[] degree = new int[n];
for (int[] edge : edges) {
	// 一条边的两个端点,都要计算度以及构建对应的邻接关系
    degree[edge[0]]++;
    degree[edge[1]]++;
    adj.get(edge[0]).add(edge[1]);
    adj.get(edge[1]).add(edge[0]);
}

1.2 入度为1的先入队

// 出度为1的入队
LinkedList<Integer> queue = new LinkedList<>();
for (int i = 0; i < n; i++) {
    if (degree[i] == 1) {
        queue.offer(i);
    }
}

1.3 BFS遍历

while (!queue.isEmpty()) {
    // 清空数组,每层遍历,res存储的都是
    res.clear();
    int size = queue.size();
    for (int i = 0; i < size; i++) {
        // 从队列中移除一个度为1的元素并把它加入到结果集
        Integer cur = queue.poll();
        res.add(cur);
        // 根据当前元素,拿到与他的邻接元素
        List<Integer> nextNode = adj.get(cur);
        // 更新邻接元素的度,如果度-1之后,为1,说明它是新的叶子节点(老的我们直接删除),继续丢到队列,进入下一层循环
        for (Integer next : nextNode) {
            degree[next]--;
            if (degree[next] == 1) {
                queue.offer(next);
            }
        }
    }
}
// 到这里,res留下的就是根节点
return res;

完整代码如下:

public class Test310 {
    public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        ArrayList<Integer> res = new ArrayList<>();
        // 如果只有一个节点,直接返回根节点0
        if (n == 1) {
            res.add(0);
            return res;
        }
        // 构建邻接表和出度数组
        List<List<Integer>> adj = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            adj.add(new ArrayList<>());
        }
        int[] degree = new int[n];
        for (int[] edge : edges) {
            degree[edge[0]]++;
            degree[edge[1]]++;
            adj.get(edge[0]).add(edge[1]);
            adj.get(edge[1]).add(edge[0]);
        }
        // 出度为1的入队
        LinkedList<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            if (degree[i] == 1) {
                queue.offer(i);
            }
        }

        while (!queue.isEmpty()) {
            // 清空数组,每层遍历,res存储的都是
            res.clear();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                // 从队列中移除一个度为1的元素并把它加入到结果集
                Integer cur = queue.poll();
                res.add(cur);
                // 根据当前元素,拿到与他的邻接元素
                List<Integer> nextNode = adj.get(cur);
                // 更新邻接元素的度,如果度-1之后,为1,说明它是新的叶子节点(老的我们直接删除),继续丢到队列,进入下一层循环
                for (Integer next : nextNode) {
                    degree[next]--;
                    if (degree[next] == 1) {
                        queue.offer(next);
                    }
                }
            }
        }
        // 到这里,res留下的就是根节点
        return res;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你的支付环境是否安全?

1、平台支付逻辑全流程分析分析 2、平台支付漏洞如何利用&#xff1f;买东西还送钱&#xff1f; 3、BURP抓包分析修改支付金额&#xff0c;伪造交易状态&#xff1f; 4、修改购物车参数实现底价购买商品 5、SRC、CTF、HW项目月入10W副业之路 6、如何构建最适合自己的网安学习路…

【项目经理】目标管理工具

目标管理工具 1. WBS 任务分解法&#x1f44a;原则方法标准 2. 6W2H法WhatwhyWhowhen⏲️WhereWhichHowHow much 3. SWOT分析法strengths-优势Weaknesses-劣势Opportunities-机会Threats-威胁 4. 二八原则法巴列特定律准则例子 5. SMART原则SpecificMeasurableAttainableReleva…

处于十字路口的CIO:继续进化还是走进死胡同

2023年初Forrester研究给出的一个坏消息表明&#xff0c;有很多CIO尚未准备好满足这些新的需求。大多数CIO&#xff08;58%&#xff09;仍处于Forrester所说的传统IT领导模式&#xff1b;有37%的CIO被认为是“现代的”&#xff0c;但只有6%的CIO是“适合未来的”&#xff0c;具…

YOLOv8优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(SC_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 💡💡💡Yolov8魔术师,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步…

面试了上百位性能测试后,我发现了一个令人不安的事实

在企业中负责技术招聘的同学&#xff0c;肯定都有一个苦恼&#xff0c;那就是招一个合适的测试太难了&#xff01;若要问起招哪种类型的测试最难时&#xff0c;相信很多人都会说出“性能测试”这个答案。 每当发布一个性能测试岗位&#xff0c;不一会就能收到上百份简历&#x…

开发者版 ONLYOFFICE 文档 7.5:API 和文档生成器更新

随着版本 7.5 中新功能的发布&#xff0c;我们更新了编辑器、文档生成器、插件和桌面应用程序的 API。阅读本文查看所有详细信息。 用于处理表单的 API 隐藏/显示提交表单按钮&#xff1a;使用 editorConfig.customization.submitForm 参数&#xff0c;可以定义 OFORM 文件的顶…

【CV】图像分割详解!

图像分割是计算机视觉研究中的一个经典难题&#xff0c;已经成为图像理解领域关注的一个热点&#xff0c;图像分割是图像分析的第一步&#xff0c;是计算机视觉的基础&#xff0c;是图像理解的重要组成部分&#xff0c;同时也是图像处理中最困难的问题之一。所谓图像分割是指根…

【量化交易笔记】12.海龟交易策略

引言 海龟交易法则是一种著名的趋势跟踪交易策略&#xff0c;适用于中长线投资者。 海龟交易策略&#xff08;Turtle Trading&#xff09;起源于美国&#xff0c;由著名的交易员理查德丹尼斯&#xff08;Richard Dennis&#xff09;创立。这种交易策略属于趋势跟踪策略&#…

Quirks(怪癖)模式是什么?它和 Standards(标准)模式有什么区别?

目录 前言: 用法: 代码: Quirks模式示例: Standards模式示例: 理解: Quirks模式&#xff1a; Standards模式&#xff1a; 高质量讨论: 前言: "Quirks模式"和"Standards模式"是与HTML文档渲染模式相关的两种模式。它们影响着浏览器如何解释和渲染HT…

华夏版-超功能记事本 Ⅲ 8.8易语言源码

华夏版-超功能记事本 Ⅲ 8.8易语言源码 下载地址&#xff1a;https://user.qzone.qq.com/512526231

VisualStudio[WPF/.NET]基于CommunityToolkit.Mvvm架构开发

一、创建 "WPF应用程序" 新项目 项目模板选择如下&#xff1a; 暂时随机填一个目标框架&#xff0c;待会改&#xff1a; 二、修改“目标框架” 双击“解决方案资源管理器”中<项目>CU-APP, 打开<项目工程文件>CU-APP.csproj, 修改目标框架TargetFramew…

windows开机自启动和忘记密码-备忘

windows开机自启动和忘记密码-备忘 文章目录 windows开机自启动和忘记密码-备忘1.自启动网址定时任务方式 2.忘记windows用户密码 1.自启动 网址 参考博文&#xff1a;https://blog.csdn.net/wwzmvp/article/details/113656544&#xff0c;感谢博主。 定时任务方式 如图&#…

uniapp如何跳转系统授权管理页?

如何跳转系统授权管理页&#xff1f; 跳转APP应用授权设置页面 文章目录 如何跳转系统授权管理页&#xff1f;效果图打开系统App的权限设置界面 效果图 例&#xff1a;Android 打开系统App的权限设置界面 App端&#xff1a;打开系统App的权限设置界面微信小程序&#xff1a;打开…

20231024后端研发面经整理

1.如何在单链表O(1)删除节点&#xff1f; 狸猫换太子 2.redis中的key如何找到对应的内存位置&#xff1f; 哈希碰撞的话用链表存 3.线性探测哈希法的插入&#xff0c;查找和删除 插入&#xff1a;一个个挨着后面找&#xff0c;知道有空位 查找&#xff1a;一个个挨着后面找…

express session

了解 Session 认证的局限性 Session 认证机制需要配合 cookie 才能实现。由于 Cookie 默认不支持跨域访问&#xff0c;所以&#xff0c;当涉及到前端跨域请求后端接口的时候&#xff0c;需要做很多额外的配置&#xff0c;才能实现跨域 Session 认证。 注意&#xff1a; 当前端…

Unity实现方圆多少米范围随机生成怪物

using System.Collections; using System.Collections.Generic; using UnityEngine;public class CreatMonster : MonoBehaviour {// S这个脚本间隔一点时间生成怪物/*1.程序逻辑* 1. 设计一个计时器* 2.间隔一段时间3s执行一下 * */float SaveTime 0f;public GameObject …

【C++笔记】C++继承

【C笔记】C继承 一、继承的概念二、继承的语法和权限三、父类和子类成员之间的关系3.1、子类赋值给父类(切片)3.2、同名成员 四、子类中的默认成员函数4.1、构造函数4.2、拷贝构造4.3、析构函数 五、C继承大坑之“菱形继承”5.1、什么是“菱形继承”5.2、解决方法 一、继承的概…

为什么自学或是培训完软件测试后,找不到工作?原因可能是这几种

最近我的一个表弟想学习软件测试&#xff0c;但他一直在犹豫是报班还是自学&#xff0c;甚至担心学完后市场饱和了&#xff0c;学完找不到工作。那么借用这次机会&#xff0c;跟大家进行分析一下软件测试行业找不到工作的几个原因&#xff0c;希望能够帮助到大家&#xff0c;少…

Python(一)关键字、内置函数

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&am…

随笔:使用Python爬取知乎上相关问题的所有回答

项目中数据分析的需要自己从知乎某个专门的问题上爬数据&#xff0c;但众所周知&#xff0c;知乎的问题的显示方式有点胃疼&#xff08;指滑动后下翻加载更多回答&#xff0c;还经常卡住&#xff09;&#xff0c;翻了翻网上的教程发现有的要么就是很老了要么就是付费的&#xf…