algorithm
  • README
  • 算法题目
    • Page 1
  • 算法基础
    • 堆(大/小顶堆 、优先队列)
      • swift
      • js
      • C++
    • 哈希表(HashTable)
      • 线性探测
        • 稠密哈希表
        • 密集探测哈希表vs线性探测哈希表
      • C拉链法
        • 拉链法是否需要根据负载因子扩容?
      • set的实现
      • map的实现
    • 二叉树
      • 类型
        • AVL树和红黑树的关系与区别比较
      • 存储方式
      • 遍历
        • 前中后序遍历(深度)
          • 递归方式
          • 迭代法
        • 层次遍历(广度)
      • 二叉搜索树
        • 基本概念
        • 代码实现
      • AVL树
        • 基本概念
        • 代码实现
        • 疑问
          • AVL为什么LL的时候右转呢?
          • AVL树中的LR的情况
          • AVL树的调整
          • 删除节点的逻辑
      • 红黑树
        • 基本概念
        • 代码实现
        • 疑问
          • 红黑树和AVL的关系与区别
          • 红黑树和哈希表的关系与区别
          • 为什么有红黑树,比AVL优势在哪里?
    • 运算符
      • 交换两个数(不用临时变量)
  • leetcode结构
    • Javascript
      • 优先队列
    • C++
  • 公司面试题目
    • 汇丰银行
      • 跑步同一个脚印问题
      • 销售系统问题
Powered by GitBook
On this page
  1. 算法基础
  2. 二叉树
  3. 二叉搜索树

代码实现

下面是一个简单的C语言实现二叉搜索树(Binary Search Tree, BST)的示例,包括构建、插入、删除和查找等基本操作。

#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 = newNode->right = NULL;
    return newNode;
}

// 插入节点
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;
}

// 查找节点
Node* search(Node* root, int data) {
    if (root == NULL || root->data == data) {
        return root;
    }
    if (data < root->data) {
        return search(root->left, data);
    }
    return search(root->right, data);
}

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

// 删除节点
Node* deleteNode(Node* root, int data) {
    if (root == NULL) {
        return root;
    }
    if (data < root->data) {
        root->left = deleteNode(root->left, data);
    } else if (data > root->data) {
        root->right = deleteNode(root->right, data);
    } else {
        // 找到要删除的节点
        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;
        }
        // 找到右子树的最小节点
        Node* temp = findMin(root->right);
        root->data = temp->data; // 用最小节点替代当前节点
        root->right = deleteNode(root->right, temp->data); // 删除最小节点
    }
    return root;
}

// 中序遍历
void inorderTraversal(Node* root) {
    if (root != NULL) {
        inorderTraversal(root->left);
        printf("%d ", root->data);
        inorderTraversal(root->right);
    }
}

// 主函数
int main() {
    Node* root = NULL;
    
    // 插入节点
    root = insert(root, 50);
    root = insert(root, 30);
    root = insert(root, 70);
    root = insert(root, 20);
    root = insert(root, 40);
    root = insert(root, 60);
    root = insert(root, 80);
    
    printf("中序遍历: ");
    inorderTraversal(root);
    printf("\n");
    
    // 查找节点
    int key = 40;
    Node* foundNode = search(root, key);
    if (foundNode) {
        printf("找到节点: %d\n", foundNode->data);
    } else {
        printf("未找到节点: %d\n", key);
    }
    
    // 删除节点
    root = deleteNode(root, 50);
    printf("删除 50 后的中序遍历: ");
    inorderTraversal(root);
    printf("\n");
    
    return 0;
}

代码说明

  1. 结构体定义:Node结构体表示树的节点,包含数据和左右子节点指针。

  2. 插入函数:insert用于将新节点插入到适当的位置。

  3. 查找函数:search用于查找特定值的节点。

  4. 删除函数:deleteNode用于删除节点,处理三种情况:无子节点、一个子节点、两个子节点。

  5. 中序遍历:inorderTraversal用于输出树的节点值,以验证结构。

使用

  • 在main函数中插入一些节点,并进行查找和删除操作。

  • 通过中序遍历输出节点,验证树的结构。

有助于理解AVL的删除节点的操作,其实是一样的。

Previous基本概念NextAVL树

Last updated 7 months ago