当前位置: 首页 > news >正文

二叉树part6 | ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

文章目录

  • 654.最大二叉树
    • 思路
    • 代码
  • 617.合并二叉树
    • 思路
    • 代码
  • 700.二叉搜索树中的搜索
    • 思路
    • 代码
  • 98.验证二叉搜索树
    • 思路
    • 官方题解
    • 代码
    • 困难
  • 今日收获


654.最大二叉树

思路

前序遍历构造二叉树。
找出数组中最大值,然后递归处理左右子数组。
时间复杂度On2
空间复杂度On

代码

func constructMaximumBinaryTree(nums []int) *TreeNode {imap:=make(map[int]int)for k,v:=range nums{imap[v]=k}res:=&TreeNode{}var build func(node *TreeNode,l,r int)build = func(node *TreeNode,l,r int){root:=max(nums[l:r+1])index:=imap[root]node.Val=rootif index>l{node.Left=&TreeNode{}build(node.Left,l,index-1)}if index<r{node.Right=&TreeNode{}build(node.Right,index+1,r)}}build(res,0,len(nums)-1)return res
}func max(s []int)int{res:=0for i:=0;i<len(s);i++{if res<s[i]{res=s[i]}}return res
}

617.合并二叉树

思路

递归构建。
目的是合并ab树,每一步递归要做的事当前节点的值为a树和b树相加,左子树为a树左子树和b树左子树递归合并,右子树为a树右子树和b树右子树递归合并。
时间复杂度On
空间复杂度On

代码

func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {res:=&TreeNode{}if root1==nil&&root2==nil{return nil}if root1!=nil&&root2!=nil{res.Val=root1.Val+root2.Valres.Left=mergeTrees(root1.Left,root2.Left)res.Right=mergeTrees(root1.Right,root2.Right)}else if root1!=nil{res.Val=root1.Valres.Left=mergeTrees(root1.Left,nil)res.Right=mergeTrees(root1.Right,nil)}else if root2!=nil{res.Val=root2.Valres.Right=mergeTrees(nil,root2.Right)res.Left=mergeTrees(nil,root2.Left)}return res
}

700.二叉搜索树中的搜索

思路

二叉搜索树中序遍历迭代即可
时间复杂度On

代码

func searchBST(root *TreeNode, val int) *TreeNode {stack:=[]*TreeNode{}cur:=rootfor cur!=nil||len(stack)>0{for cur!=nil{stack=append(stack,cur)cur=cur.Left}cur=stack[len(stack)-1]if cur.Val==val{return cur}stack=stack[:len(stack)-1]cur=cur.Right}return nil
}

98.验证二叉搜索树

思路

递归,每一层递归的目的是判断当前节点的左右子树的所有节点是否都小于或大于当前节点,然后再递归地判断左右子树是否是二叉搜索树。
时间复杂度Onlogn
还可以优化

官方题解

要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。
有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
时间复杂度On

代码

func isValidBST(root *TreeNode) bool {if root==nil{return true}if root.Left!=nil{ml,_:=maxmin(root.Left)if ml>=root.Val{return false}}if root.Right!=nil{_,mr:=maxmin(root.Right)if mr<=root.Val{return false}}return isValidBST(root.Left)&&isValidBST(root.Right)
}func maxmin(root *TreeNode) (int,int){max,min:=root.Val,root.Valif root.Left!=nil{maxl,minl:=maxmin(root.Left)if max<maxl{max=maxl}if min>minl{min=minl}}if root.Right!=nil{maxr,minr:=maxmin(root.Right)if max<maxr{max=maxr}if min>minr{min=minr}}return max,min
}

困难

开始递归的条件和者终止条件要保持一致性,比如默认只有节点不为空才开始递归,那么终止条件就可以不写节点为空。


今日收获

根据数组构建二叉树的统一写法。
res:=&TreeNode{}
res.Val=…
res.Left=递归…
验证二叉搜索树的写法。

http://www.lryc.cn/news/91619.html

相关文章:

  • Linux命令记录
  • eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时
  • Linux :: vim 编辑器的初次体验:三种 vim 常用模式 及 使用:打开编辑、退出保存关闭vim
  • Linux内核进程创建流程
  • 【03.04】大数据教程--HTTP协议和静态Web服务器
  • 数据共享传输:台式机和笔记本同步文件!
  • java设计模式(十二)代理模式
  • Umi微前端水印踩坑以及解决方案
  • Android RK3588-12 hdmi-in Camera方式支持NV24格式
  • Hive窗口函数详细介绍
  • 牛客网【c语言练习】
  • C++类和对象(上)
  • JavaScript 数据透视表 DHTMLX Pivot Crack
  • QT链接库设置
  • 零点起飞学Android——期末考试课本复习重点
  • Redis为什么快?
  • Zabbix从入门到精通以及案例实操系列
  • 水声声波频率如何划分?水声功率放大器可将频率放大到20MHz吗?
  • 网络攻防技术--论文阅读--《基于自动数据分割和注意力LSTM-CNN的准周期时间序列异常检测》
  • C++ 学习 ::【基础篇:08】:C++ 中 struct 结构体的认识【面试考点:C 与 C++ 中结构体的区别】
  • Electron开发:打包和发布 Electron 应用
  • 【每日一题Day222】LC1110删点成林 | dfs后序
  • [ChatGPT] 从 GPT-3.5 到 GPT-5 的进化之路 | ChatGPT和程序员 : 协作 or 取代
  • 6.4 GDP调试多进程程序
  • TDengine 时序数据的保留策略
  • Java-多线程解析1
  • PHP 判断用户当前坐标是否在电子围栏内
  • Java版本工程管理系统源码企业工程项目管理系统简介
  • 高速缓存(cache)的原理: 了解计算机架构与性能优化
  • 【Vue3+TS项目】硅谷甄选day04--顶部组件搭建+面包屑+路由鉴权