| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 洛谷3884-二叉树问题-python-(dfs+bfs+lca+倍增) -> 正文阅读 |
|
[数据结构与算法]洛谷3884-二叉树问题-python-(dfs+bfs+lca+倍增) |
对于一个二叉树来讲,我们通常的问题一般有一下几种: 下面就利用一些算法来实现以上的要求 对于题目中的数据的存储方式的代码
测试数据
我们构建的树大概是这个样子
①解决二叉树的深度问题无疑是利用dfs算法一直向下搜索,到终点后记录深度,最后输出最大深度。
最后的deep就是我们要的最大的深度 ②求解树的宽度,我利用bfs算法得出树的宽度。首先开一个以为数组,数组的大小为树的深度,我们记录每一个深度下的结点的个数,然后取最大值就是树的宽度。
③求解两个结点的LCA 我们想到了倍增数组来进行时空权衡 定义一个二维数组fa[n+1] [7],一个一维数组dep[n+1] 首先我们要对fa数组进行初始化,即得出每一个结点的父结点,在这里我们可以看到我们初始化的是fa[i][0],2^0=1,也就是求出每一个结点的父结点
我们当前得出的状态如下表格所示:(空格都是-1)
其次我们要利用我们初始化之后的fa数组来完善fa数组
假设我们要求fa[1][1],就是1号结点的前2个结点,等于求1号结点的前一个结点的前一个结点,而一号结点之前的结点已经得出,可以利用以求推出。
我们得出了每一个结点往上跳2^i步所到达的结点的序号,-1表示跳当前步数没有结点 接下来我们利用这个数组来对“向上走”进行优化。
找出父结点之后,一切都变得简单起来
最后就是我们的答案 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 16:39:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |