算法篇:树之利用数组处理链表
时间:2022-07-23
本文章向大家介绍算法篇:树之利用数组处理链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法:
这类题目的一个共同的特点是,转化成数组之后,可以有效的利用数组的有序性来更方便的解决问题。
核心思想是,先利用数据将树变成有序性,然后统一操作有序数组,进行构建;然后再通过数组进行统一操作就可以。
题目1:
https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func flatten(root *TreeNode) {
// 1. 将树变成数组,利用数组的有序性
l := preOrder(root)
if l == nil {
return
}
// 2. 将有序数组统一构建成一个链式的树结构
for i:=1; i< len(l);i++ { // 这里要注意的是i 从1 开始,因为我们用到了i-1做前缀
pre,cur := l[i-1],l[i]
pre.Left = nil
pre.Right = cur
}
return
}
func preOrder(root *TreeNode) []*TreeNode {
if root == nil {
return nil
}
res := []*TreeNode{}
res = append(res,root)
l := preOrder(root.Left)
res = append(res,l...)
r := preOrder(root.Right)
res = append(res,r...)
return res
}
// 算法:
// 核心思想是,先利用数据将树变成有序性,然后统一操作有序数组,进行构建
执行结果:
题目2:
这个题目可以通过数组的有序性来操作,表现虽然没有那么好,不过还是想把这个解法写了下来,用来表明数组的用途。
https://leetcode-cn.com/problems/convert-bst-to-greater-tree/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func convertBST(root *TreeNode) *TreeNode {
l := midOrder(root)
if l == nil {
return nil
}
sum := 0
for i:=len(l)-1;i>=0;i-- {
l[i].Val += sum
sum = l[i].Val
}
return root
}
func midOrder(root *TreeNode) []*TreeNode {
if root == nil {
return nil
}
res := []*TreeNode{}
l := midOrder(root.Left)
res = append(res,l...)
res = append(res,root)
r := midOrder(root.Right)
res = append(res,r...)
return res
}
执行结果:
- OVS中Action源码分析&自定义Action
- 读懂一行Full GC日志(回复JVM内存分配担保机制一文中 Mr/Mrs Xxx 在留言区提出的问题)
- 总结了一些指针易出错的常见问题(四)
- 当你在浏览器中输入Google.com并且按下回车之后发生了什么?
- 总结了一些指针易出错的常见问题(三)
- C++/C头文件 .h和 .c
- 史上最清晰的红黑树讲解(下)
- 网络操作系统VyOS安装与初步使用
- 为何webpack风靡全球?三大主流模块打包工具对比
- 今天研究了一下手机通信录管理系统(C语言)
- Android软件测试Monkey测试工具
- 程序员面试50题(4)—把字符串转换成整数[算法]
- 程序员面试50题(3)—翻转句子中单词的顺序[算法]
- H5动画开发快车道
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springboot之第一个springboot程序
- 「查缺补漏」巩固你的RocketMQ知识体系
- springboot之场景启动器
- ICLR2020 | 深度自适应Transformer
- springboot之自动配置
- golang--连接redis数据库并进行增删查改
- golang--redis连接池
- springboot配置之使用application.properties时编码问题
- mybatis动态sql之foreach补充(二)
- golang数据结构之稀疏数组
- mybatis扩展之使用PageHelper插件进行分页(是真好用)
- 动态规划--0,1背包问题(再也不怕类似背包问题了)
- springboot配置之Profile多环境支持
- LeetCode | 102.二叉树的层次遍历
- golang数据结构之队列