【PTA数据结构 | C语言版】二叉查找树的操作

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

请编写程序,实现二叉查找树的插入、删除、查找操作,并完成简单的测试。

输入格式:
输入首先给出一个正整数 n(≤10),随后一行给出 n 个不重复的整数。最后一行给出一个测试用的整数 key。

输出格式:
执行以下操作并输出:

将给出的 n 个不重复的整数顺次插入一棵初始为空的二叉查找树。
查找 key 是否在树中。如果找到了,在一行中输出 Found key = key;否则输出 NotFound.。
将 key 从树中删除。注意:如果要求从树中删除一个不存在的结点,应该在一行中输出错误信息 错误:x不在树中。,其中 x 是被要求删除的结点键值。
再次查找 key 是否在树中。如果找到了,在一行中输出 Found key = key;否则输出 NotFound.。

输入样例 1:
8
4 3 6 8 7 1 2 5
5

输出样例 1:
Found key = 5
NotFound.

输入样例 2:
8
4 3 6 8 7 1 2 5
9

输出样例 2:
NotFound.
错误:9不在树中。
NotFound.

代码

#include <stdio.h>
#include <stdlib.h>

// 二叉查找树节点结构
typedef struct Node {
    int data;
    struct Node *left;
    struct Node *right;
} Node;

// 创建新节点
Node* createNode(int data) {
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 插入节点到BST
Node* insert(Node *root, int data) {
    if (root == NULL) {
        return createNode(data);
    }
    if (data < root->data) {
        root->left = insert(root->left, data);
    } else if (data > root->data) {
        root->right = insert(root->right, data);
    }
    return root;
}

// 查找BST中的节点
int search(Node *root, int key) {
    if (root == NULL) {
        return 0; // 未找到
    }
    if (root->data == key) {
        return 1; // 找到
    } else if (key < root->data) {
        return search(root->left, key);
    } else {
        return search(root->right, key);
    }
}

// 找到以root为根的树中的最小值节点
Node* findMin(Node *root) {
    while (root->left != NULL) {
        root = root->left;
    }
    return root;
}

// 从BST中删除节点
Node* deleteNode(Node *root, int key, int *deleted) {
    if (root == NULL) {
        *deleted = 0; // 未找到要删除的节点
        return NULL;
    }
    
    if (key < root->data) {
        root->left = deleteNode(root->left, key, deleted);
    } else if (key > root->data) {
        root->right = deleteNode(root->right, key, deleted);
    } else {
        // 找到要删除的节点
        *deleted = 1;
        
        // 情况1:叶子节点或只有一个子节点
        if (root->left == NULL) {
            Node *temp = root->right;
            free(root);
            return temp;
        } else if (root->right == NULL) {
            Node *temp = root->left;
            free(root);
            return temp;
        }
        
        // 情况2:有两个子节点
        // 找到右子树中的最小值节点
        Node *temp = findMin(root->right);
        // 用最小值替换当前节点数据
        root->data = temp->data;
        // 删除右子树中的最小值节点
        root->right = deleteNode(root->right, temp->data, deleted);
    }
    return root;
}


int main() {
    int n;
    scanf("%d", &n);
    
    Node *root = NULL;
    // 插入n个整数到BST
    for (int i = 0; i < n; i++) {
        int data;
        scanf("%d", &data);
        root = insert(root, data);
    }
    
    int key;
    scanf("%d", &key);
    
    // 第一次查找
    if (search(root, key)) {
        printf("Found key = %d\n", key);
    } else {
        printf("NotFound.\n");
    }
    
    // 删除节点
    int deleted;
    root = deleteNode(root, key, &deleted);
    if (!deleted) {
        printf("错误:%d不在树中。\n", key);
    }
    
    // 第二次查找
    if (search(root, key)) {
        printf("Found key = %d\n", key);
    } else {
        printf("NotFound.\n");
    }
    
    return 0;
}
### PTA 6-3 二叉排序树解法 对于题目描述中的完全二叉树,如果其层次遍历序列为1,2,3,4,5,6,7,则这棵树并不是二叉排序树[^1]。 针对PTA平台第6章第3题有关于二叉排序树的内容,通常情况下,构建二叉排序树(BST)涉及插入新节点的过程。当给定一系列数值时,可以通过比较当前值与根节点的大小来决定将其放置在哪一侧子树中;小于等于则置于左子树,大于则置于右子树,并递归执行此过程直到找到合适的位置为止[^3]。 下面是一个简单的C++实现例子用于创建并打印二叉排序树: ```cpp #include <iostream> using namespace std; struct TreeNode { int val; TreeNode *left, *right; TreeNode(int x) : val(x), left(NULL), right(NULL){} }; TreeNode* insertIntoBST(TreeNode* root, int value){ if (!root){ // 当前位置为空,则新建节点作为新的分支起点 return new TreeNode(value); } if (value <= root->val){ root->left = insertIntoBST(root->left,value); // 插入到左侧 }else{ root->right = insertIntoBST(root->right,value); // 插入到右侧 } return root; // 返回更新后的根指针 } void inorderTraversal(TreeNode* node){ if(node != nullptr){ inorderTraversal(node->left); // 访问左孩子 cout << " " << node->val ; // 输出中间节点 inorderTraversal(node->right); // 访问右孩子 } } ``` 上述代码展示了如何通过函数`insertIntoBST()`向已有的二叉排序树中添加元素以及使用`inorderTraversal()`方法对其进行中序遍历来验证结构正确性。需要注意的是,在实际编程环境中可能还需要考虑边界情况和其他异常处理逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值