前言
不知不觉六天没写题了,果然是一鼓作气,再而衰,三而竭。8号那天斗志还很足,玩了几天游戏,越玩越停不下来。一直到今天开始写题。接下来的任务:为2023总结多增加点东西!!!
内容
一、二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点 root
和要插入树中的值 value
,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
递归
根据 val与 root.val的大小关系,就可以确定要将 val插入到哪个子树中。
func insertIntoBST(root *TreeNode, val int) *TreeNode {
if root==nil{
root=&TreeNode{Val:val}
return root
}
if val>root.Val{
root.Right=insertIntoBST(root.Right,val)
}else{
root.Left=insertIntoBST(root.Left,val)
}
return root
}
二、删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
递归
多种情况:没找到root;找到root:没有左右孩子,有左孩子,有右孩子,有左右孩子。
即二叉树有可能被更新
func deleteNode(root *TreeNode, key int) *TreeNode {
switch{
case root==nil:
return root
case root.Val>key:
root.Left=deleteNode(root.Left,key)
case root.Val<key:
root.Right=deleteNode(root.Right,key)
case root.Left==nil||root.Right==nil:
if root.Left!=nil{
return root.Left
}
return root.Right
default://root有左右节点
successor:=root.Right
for successor.Left!=nil{
successor=successor.Left
}//找到右子树的最小节点 代替root
successor.Right=deleteNode(root.Right,successor.Val)// 并将它删除
successor.Left=root.Left
return successor
}
return root
}
最后
按进度,明天结束二叉树!冲!