删除二叉搜索树中的节点|Go主题月

1,874 阅读3分钟

【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕

应该会超过一部分的面试者。

对树不熟悉的朋友,可以看看前面的基础训练题哦!

leecode 450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;

如果找到了,删除它。

说明: 要求算法时间复杂度为 O(h),h 为树的高度。

示例:

图片.png


参考代码

定义一颗树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int          // 根
 *     Left *TreeNode   //左节点
 *     Right *TreeNode  //右节点
 * }
 */

二叉搜索树,左边比根节点小,右边比根节点大

GO语言版 迭代

例如:

图片.png 先想一想,如果删除根节点的话,假如是3,右节点4应该会顶上去,或者左节点2顶上去才满足条件。

我们以右节点顶上去为例

假如删除5,根节点,很明显,左子树不用动

  1. 找到右边最小的数值的右节点数字6

  2. 删除这个节点,删除就是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块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️