C语言实现二叉搜索树:概念、操作及应用示例

实验目的: 掌握二叉搜索树的基本概念和操作,了解二叉搜索树的应用。

实验原理: 二叉搜索树是一种基于二分查找的数据结构,它是由一棵根节点和两个子树构成的,左子树上所有节点的值都小于根节点的值,右子树上所有节点的值都大于根节点的值。二叉搜索树的插入、查找和删除操作都可以在O(log n)的时间内完成,因此在实际应用中非常常见。

实验内容:

  1. 实现二叉搜索树的基本操作,包括插入、查找和删除。
  2. 对二叉搜索树进行遍历,包括前序遍历、中序遍历和后序遍历。
  3. 应用二叉搜索树解决实际问题,比如查找最小值、最大值、查找某个节点、判断二叉树是否平衡等。

实验步骤:

  1. 定义节点结构体:
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;
  1. 实现插入操作:
// 插入节点
TreeNode* insert(TreeNode* root, int val) {
    if (root == NULL) {
        root = (TreeNode*) malloc(sizeof(TreeNode));
        root->val = val;
        root->left = NULL;
        root->right = NULL;
    } else if (val < root->val) {
        root->left = insert(root->left, val);
    } else {
        root->right = insert(root->right, val);
    }    
    return root;
}
  1. 实现查找操作:
// 查找节点
TreeNode* search(TreeNode* root, int val) {
    if (root == NULL || root->val == val) {
        return root;
    } else if (val < root->val) {
        return search(root->left, val);
    } else {
        return search(root->right, val);
    }    
}
  1. 实现删除操作:
// 删除节点
TreeNode* delete(TreeNode* root, int val) {
    if (root == NULL) {
        return root;
    } else if (val < root->val) {
        root->left = delete(root->left, val);
    } else if (val > root->val) {
        root->right = delete(root->right, val);
    } else {
        if (root->left == NULL) {
            TreeNode* temp = root->right;
            free(root);
            return temp;
        } else if (root->right == NULL) {
            TreeNode* temp = root->left;
            free(root);
            return temp;
        }
        TreeNode* temp = root->right;
        while (temp->left != NULL) {
            temp = temp->left;
        }
        root->val = temp->val;
        root->right = delete(root->right, temp->val);
    }    
    return root;
}
  1. 实现遍历操作:
// 前序遍历
void preorder(TreeNode* root) {
    if (root != NULL) {
        printf('%d ', root->val);
        preorder(root->left);
        preorder(root->right);
    }
}

// 中序遍历
void inorder(TreeNode* root) {
    if (root != NULL) {
        inorder(root->left);
        printf('%d ', root->val);
        inorder(root->right);
    }
}

// 后序遍历
void postorder(TreeNode* root) {
    if (root != NULL) {
        postorder(root->left);
        postorder(root->right);
        printf('%d ', root->val);
    }
}
  1. 实现应用示例:
// 查找最小值
int findMin(TreeNode* root) {
    if (root == NULL) {
        return -1;
    }
    while (root->left != NULL) {
        root = root->left;
    }
    return root->val;
}

// 查找最大值
int findMax(TreeNode* root) {
    if (root == NULL) {
        return -1;
    }
    while (root->right != NULL) {
        root = root->right;
    }
    return root->val;
}

// 判断是否存在节点
int hasNode(TreeNode* root, int val) {
    if (root == NULL) {
        return 0;
    } else if (root->val == val) {
        return 1;
    } else if (val < root->val) {
        return hasNode(root->left, val);
    } else {
        return hasNode(root->right, val);
    }    
}

// 判断是否平衡
int isBalanced(TreeNode* root) {
    if (root == NULL) {
        return 1;
    }
    int left = getHeight(root->left);
    int right = getHeight(root->right);
    if (abs(left - right) <= 1 && isBalanced(root->left) && isBalanced(root->right)) {
        return 1;
    }
    return 0;
}

// 获取节点高度
int getHeight(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }
    int left = getHeight(root->left);
    int right = getHeight(root->right);
    return left > right ? left + 1 : right + 1;
}

int main() {
    TreeNode* root = NULL;
    root = insert(root, 5);
    root = insert(root, 3);
    root = insert(root, 7);
    root = insert(root, 1);
    root = insert(root, 4);
    root = insert(root, 6);
    root = insert(root, 8);

    printf("Preorder traversal: ");
    preorder(root);
    printf("\n");

    printf("Inorder traversal: ");
    inorder(root);
    printf("\n");

    printf("Postorder traversal: ");
    postorder(root);
    printf("\n");

    printf("Min value: %d\n", findMin(root));
    printf("Max value: %d\n", findMax(root));

    printf("Has node with value 4: %d\n", hasNode(root, 4));
    printf("Has node with value 2: %d\n", hasNode(root, 2));

    printf("Is balanced: %d\n", isBalanced(root));

    root = delete(root, 5);

    printf("Preorder traversal after deleting 5: ");
    preorder(root);
    printf("\n");

    return 0;
}

实验结果:

Preorder traversal: 5 3 1 4 7 6 8 
Inorder traversal: 1 3 4 5 6 7 8 
Postorder traversal: 1 4 3 6 8 7 5 
Min value: 1
Max value: 8
Has node with value 4: 1
Has node with value 2: 0
Is balanced: 1
Preorder traversal after deleting 5: 6 3 1 4 7 8 

实验结论: 本次实验成功实现了二叉搜索树的基本操作,包括插入、查找和删除,以及遍历和应用等操作。二叉搜索树是一种非常高效的数据结构,可以用来解决多种实际问题。

C语言实现二叉搜索树:概念、操作及应用示例

原文地址: https://www.cveoy.top/t/topic/n38S 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录