美文网首页算法代码
删除二叉树中的节点

删除二叉树中的节点

作者: windUtterance | 来源:发表于2020-06-06 10:43 被阅读0次

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

示例
输入
[5,3,6,2,4,null,7]
3
输出
[5,4,6,2,null,null,7]

Java代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //寻找后继节点:先取当前节点的右节点,然后一直取该节点的左节点,直到左节点为空,最后指向的节点即为后继节点
    public int successor(TreeNode root) {
        root = root.right;
        while(root.left != null) root = root.left;
        return root.val;
    }

    //寻找前驱节点:先取当前节点的左节点,然后一直取该节点的右节点,直到右节点为空,最后指向的节点即为前驱节点
    public int predecessor(TreeNode root) {
        root = root.left;
        while(root.right != null) root = root.right;
        return root.val;
    }

    public TreeNode deleteNode(TreeNode root, int key) {
        //递归终止条件
        if(root == null) return null;

        //查找的节点比根节点大,则继续在右子树查找并删除该节点
        if(key > root.val) {
            root.right = deleteNode(root.right, key);
        } else if(key < root.val) {  //如果查找的结点比根节点小,继续在左子树查找删除该结点
            root.left = deleteNode(root.left, key);
        } else {  //如果找到了该结点,删除它
            if(root.left == null && root.right == null) {  //以叶子节点为根节点的二叉搜索树只有一个元素,可以直接删除
                root = null;
            } else if(root.right != null) {  //如果有右子树,只要找到该右子树的后继节点来替换,之后将其删除即可
                root.val = successor(root);
                root.right = deleteNode(root.right, root.val);
            } else {  //如果有左子树,只要找到前驱节点来替换,然后将其删除即可
                root.val = predecessor(root);
                root.left = deleteNode(root.left, root.val);
            }
        }
        return root;
    }
}

相关文章

  • 二叉树

    1.二叉树的遍历:前序、中序、后序遍历 2.二叉树查找节点和删除节点的代码

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 结合2-3-4树理解红黑树(3) —— 删除

    首先在分析红黑树删除操作之前先说明一下搜索二叉树中删除一个节点时的一个技巧。当删除节点位与树的内节点时,这个时候可...

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 《剑指Offer》知识点整理

    链表 从尾到头打印链表 删除链表节点 链表中倒数 k 个节点 合并两个有序链表 两个链表的公共节点 树 二叉树遍历...

  • 450. Delete Node in a BST

    删除 BST 中的指定元素,并维持二叉树的结构不变。 遍历,找到元素后: 如果左子节点不存在,返回右子节点 如果右...

  • 利用链表实现二叉树

    节点 成员变量:左子树、右子树、key、value 二叉树 成员变量:根节点、节点数量方法:插入、删除、获取某个节...

  • [数据结构与算法-iOS 实现] 二叉树附demo,前序遍历、后

    二叉树附demo,前序遍历、后序遍历、层序遍历、删除一个二叉树的节点,前驱后继节点等概念啊和原理 demo 基本概...

  • JS-删除节点removeChild()/替换元素节点repla

    删除节点removeChild() removeChild() 方法从子节点列表中删除某个节点。如删除成功,此方法...

  • 删除二叉树中的节点

    题目描述:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二...

网友评论

    本文标题:删除二叉树中的节点

    本文链接:https://www.haomeiwen.com/subject/bcfazhtx.html