【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.
😄
我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕
应该会超过一部分的面试者。
对树不熟悉的朋友,可以看看前面的基础训练题哦!
leecode 450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
参考代码
定义一颗树
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int // 根
* Left *TreeNode //左节点
* Right *TreeNode //右节点
* }
*/
二叉搜索树,左边比根节点小,右边比根节点大
GO语言版 迭代
例如:
先想一想,如果删除根节点的话,假如是3,右节点4应该会顶上去,或者左节点2顶上去才满足条件。
我们以右节点顶上去为例
假如删除5,根节点,很明显,左子树不用动
-
找到右边最小的数值的右节点数字6
-
删除这个节点,删除就是root.right.right向下走一步就行了
那么重新定义一棵树TreeNode new;
new.left = root.left // 左节点不变
new.right = (root.right没有左节点就行了,因为右左节点,会有更小的数字)root.right.right
那不就完事了??
func deleteNode(root *TreeNode, key int) *TreeNode {
if root == nil {
return nil
}
if key < root.Val {
root.Left = deleteNode( root.Left, key )
return root
}
if key > root.Val {
root.Right = deleteNode( root.Right, key )
return root
}
//到这里意味已经查找到目标
if root.Right == nil {
//右子树为空
return root.Left
}
if root.Left == nil {
//左子树为空
return root.Right
}
minNode := root.Right
for minNode.Left != nil {
//查找后继
minNode = minNode.Left
}
root.Val = minNode.Val
root.Right = deleteMinNode( root.Right )
return root
}
func deleteMinNode( root *TreeNode ) *TreeNode {
if root.Left == nil {
pRight := root.Right
root.Right = nil
return pRight
}
root.Left = deleteMinNode( root.Left )
return root
}
java
public static TreeNode deleteNode(TreeNode root, int key) {
if (!containNode(root, key)) {
return root;
}
if (root.val == key) {
if (root.left == null) {
return root.right;
} else if (root.right == null) {
return root.left;
}
TreeNode successor = findMin(root.right); // 找到右边最小的作为头节点
successor.right = delMin(root.right); //删除掉这个最小节点
successor.left = root.left;// 左子树不变
return successor;
} else if (root.val < key) {
root.right = deleteNode(root.right, key);
return root;
} else {
root.left = deleteNode(root.left, key);
return root;
}
}
@Test
public void isdeleteNode() {
TreeNode treeNode = new TreeNode(1);
treeNode.left = new TreeNode(2);
treeNode.right = new TreeNode(3);
TreeNode i = deleteNode(treeNode, 1);
Assert.assertNotNull(i);
}
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️