LintCode 87. 删除二叉查找树的节点

给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。

public class Solution {
    /*
     * @param root: The root of the binary search tree.
     * @param value: Remove the node with given value.
     * @return: The root of the binary search tree after removal.
     */
    public TreeNode removeNode(TreeNode root, int value) {
        // write your code here
        if (root == null) {
            return root;
        }
        if (root.val > value) {
            root.left = removeNode(root.left, value);
        }
        if (root.val < value) {
            root.right = removeNode(root.right, value);
        }
        if (root.val == value) {
            if (root.left == null || root.right == null) {
                root = (root.left != null) ? root.left : root.right;
            } else {
                TreeNode tmpNode = root.left;
                while (tmpNode.right != null) {
                    tmpNode = tmpNode.right;
                }
                root.val = tmpNode.val;
                root.left = removeNode(root.left, tmpNode.val);
            }
        }
        return root;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答你的问题。 1. 从键盘输入任意个关键字创建一棵二叉排序树并以括号表示法输出: 首先,我们需要定义二叉排序树的结构体: ```c typedef struct BSTNode { int data; struct BSTNode *left; struct BSTNode *right; } BSTNode; ``` 然后,我们可以按照以下方式递归地插入节点,从而创建一棵二叉排序树: ```c void insert(BSTNode **root, int data) { if (*root == NULL) { *root = (BSTNode*)malloc(sizeof(BSTNode)); (*root)->data = data; (*root)->left = NULL; (*root)->right = NULL; } else if (data < (*root)->data) { insert(&((*root)->left), data); } else { insert(&((*root)->right), data); } } ``` 接下来,我们可以按照以下方式以括号表示法输出二叉排序树: ```c void print(BSTNode *root) { if (root == NULL) { printf("()"); } else { printf("(%d", root->data); print(root->left); print(root->right); printf(")"); } } ``` 2. 在二叉排序树中查找从键盘输入的关键字: 我们可以按照以下方式递归地查找关键字: ```c BSTNode *search(BSTNode *root, int data) { if (root == NULL || root->data == data) { return root; } else if (data < root->data) { return search(root->left, data); } else { return search(root->right, data); } } ``` 如果找到了关键字,则返回其所在的节点指针,否则返回 NULL。 3. 在二叉排序树中删除指定的关键字的节点: 我们需要分两种情况考虑: - 要删除节点是叶子节点; - 要删除节点有一个子节点或两个子节点。 对于第一种情况,我们只需要将其父节点指向它的指针置为 NULL,然后释放该节点的内存即可。对于第二种情况,我们需要找到它的中序遍历的后继节点来代替它,然后将后继节点的值复制到要删除节点中,最后删除后继节点即可。 以下是删除节点的代码: ```c void delete(BSTNode **root, int data) { if (*root == NULL) { return; } else if (data < (*root)->data) { delete(&((*root)->left), data); } else if (data > (*root)->data) { delete(&((*root)->right), data); } else { if ((*root)->left == NULL && (*root)->right == NULL) { free(*root); *root = NULL; } else if ((*root)->left == NULL) { BSTNode *temp = *root; *root = (*root)->right; free(temp); } else if ((*root)->right == NULL) { BSTNode *temp = *root; *root = (*root)->left; free(temp); } else { BSTNode *temp = (*root)->right; while (temp->left != NULL) { temp = temp->left; } (*root)->data = temp->data; delete(&((*root)->right), temp->data); } } } ``` 以上就是关于二叉排序树的创建、查找和删除的实现。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值