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

news/2024/11/24 11:04:12/

文章目录

  • 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.ppmy.cn/news/234211.html

相关文章

Dell戴尔笔记本电脑Vostro 14 5410原装出厂WIN10系统恢复原厂OEM系统

Dell戴尔笔记本电脑Vostro 14 5410原装出厂Windows10系统恢复原厂oem系统20H2 系统自带所有驱动、办公软件、MyDell等预装软件 链接&#xff1a;https://pan.baidu.com/s/1ECzd6jIgYXFX0ysigUWEyQ?pwd1qr9 提取码&#xff1a;1qr9

Dell E6410 把我折腾毁了

最近因为天气炎热&#xff0c;我的E6410也发起烧来&#xff0c;来来回回折腾了我将近一个月&#xff0c;终于稳定了&#xff0c;总结一下 (1)一开始因为天气炎热&#xff0c;所以烧坏了显卡&#xff0c;总是蓝屏&#xff0c;死机&#xff0c;没有办法&#xff0c;发回去换了块主…

戴尔DELL E6530 minipcie接口扩展nvme盘,express接口装nvme盘

戴尔DELL E6530 minipcie接口扩展nvme盘&#xff0c;express接口装nvme盘。 拆开DELL E6530 后盖&#xff0c;位于minipcie网卡的右侧还有一个minipcie接口是没有使用起来的。可以通过转卡将这个接口安装nvme固态盘。 先掰开转卡成2部分&#xff0c;将排线把2部分转卡连接起来&…

linux开发:linux最大线程数分析

linux最大线程数分为&#xff0c;进程最大线程数&#xff0c;用户最大进程数&#xff0c; 整个系统已用的线程或进程数。 我们可以用下面命令进行查询这三个进程数。 linux系统可生成最大线程数可以用这个命令查询 cat /proc/sys/kernel/threads-max 进程最大线程数查询方式 ps…

微星主板 Ubuntu20.04安装以及配置

1 设置U盘启动 1&#xff09;插入使用软碟通制作好的U盘&#xff0c;开机按del键进入BIOS&#xff1b; 2&#xff09;Boot Option 中 选择U盘启动&#xff1b; 3)设置硬盘BBS&#xff08;我也不知道是什么&#xff09;&#xff1a; 4&#xff09;点击左边Settings&#xff0c…

DELL_精钢本E6410首测

前言&#xff1a; 对于商务人士来说&#xff0c;笔记本哪些地方才是重要的&#xff1f;是外观设计或者整机性能&#xff1f;是整机散热或者操作体验&#xff1f;又或者是处理器、显卡、内存、硬盘等等&#xff1f;对于商务人士来说这些或许都不重要&#xff0c;他仅仅是为了找寻…

戴尔Dell Latitude E6410/E6510官方拆机图解维修手册

卸下光盘驱动器 按照拆装计算机内部组件之前中的步骤进行操作。 卸下 ATG 端口盖&#xff08;仅适用于 E6410 ATG 计算机&#xff09;。 拧下将光盘驱动器固定到计算机的螺钉。 按下并释放光盘驱动器闩锁。 将光盘驱动器从计算机中拉出 卸下硬盘驱动器 按照拆装计算机内部组件之…

dell计算机维修教程,戴尔Dell Latitude E6410/E6510官方拆机图解维修手册

卸下光盘驱动器 按照拆装计算机内部组件之前中的步骤进行操作。 卸下 ATG 端口盖(仅适用于 E6410 ATG 计算机)。 拧下将光盘驱动器固定到计算机的螺钉。 按下并释放光盘驱动器闩锁。 将光盘驱动器从计算机中拉出 卸下硬盘驱动器 按照拆装计算机内部组件之前中的步骤进行操作。 …