搜索二叉树

本文介绍了二叉搜索树的基本概念和性质,包括其左子树所有节点小于根节点、右子树所有节点大于根节点的特性。提供了C语言实现的插入、查找和删除节点的函数,以及查找最小值和最大值的方法。示例展示了如何创建和操作二叉搜索树。
摘要由CSDN通过智能技术生成

搜索二叉树:

        1 左子树上所有节点的值均小于它的根节点的值。

        2 右子树上所有节点的值均大于它的根节点。

        3 左右子树也分别为二叉搜索树。

这些特性使得在搜索二叉树中进行查找,插入,删除等错做的时间复杂度为(logn),其中n是节点的个数。

操作:

        1 插入操作 2 查找:在树中查找一个给定的值。3 删除:删除特定节点。4 遍历

代码中我做了详细的注解。各位看客老爷认真看代码注解

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

// 定义二叉搜索树节点结构体
typedef struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

// 创建新节点
TreeNode* createNode(int val) {
    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
    node->val = val;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// 插入节点
TreeNode* insertNode(TreeNode* root, int val) {
    if (root == NULL) {
        return createNode(val);
    }
    if (val < root->val) {
        root->left = insertNode(root->left, val);
    } else if (val > root->val) {
        root->right = insertNode(root->right, val);
    }
    return root;
}

// 删除节点
TreeNode* deleteNode(TreeNode* root, int val) {
    if (root == NULL) {
        return NULL;
    }//判断树是否为空


    //找找到节点
    if (val < root->val) {
        root->left = deleteNode(root->left, val);
    } 
    else if (val > root->val) {
        root->right = deleteNode(root->right, val);
    } 
    //当val=root-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 = deleteNode(root->right, temp->val);
    }
    //返回值是根节点
    return root;
}

// 查找节点
TreeNode* searchNode(TreeNode* root, int val) {
    if (root == NULL || root->val == val) {
        return root;
    }
    if (val < root->val) {
        return searchNode(root->left, val);
    } else {
        return searchNode(root->right, val);
    }
}

// 查找最小值,最小值在根节点的左子树上,对左子树向左循环搜索找到最小值
int findMin(TreeNode* root) {
    while (root->left != NULL) {
        root = root->left;
    }
    return root->val;
}

// 查找最大值,最大值在根节点的右子树上,对右子树向右循环搜索找到最大值
int findMax(TreeNode* root) {
    while (root->right != NULL) {
        root = root->right;
    }
    return root->val;
}

/* 中序遍历,这里只是通用的中序遍历,还有一种特殊的中序遍历可以节省
二叉树浪费空间的问题,
有兴趣的话可以看看我之前的的关于二叉搜索树的一篇文章。*/
void inorderTraversal(TreeNode* root) {
    if (root != NULL) {
        inorderTraversal(root->left);
        printf("%d ", root->val);
        inorderTraversal(root->right);
    }
}

int main() {
    TreeNode* root = NULL;
    root = insertNode(root, 5);
    root = insertNode(root, 3);
    root = insertNode(root, 7);
    root = insertNode(root, 1);
    root = insertNode(root, 9);
    printf("Inorder traversal: ");
    inorderTraversal(root);
    printf("\n");
    root = deleteNode(root, 3);
    printf("Inorder traversal after deleting 3: ");
    inorderTraversal(root);
    printf("\n");
    TreeNode* node = searchNode(root, 7);
    if (node != NULL) {
        printf("Found node with value 7\n");
    } else {
        printf("Node with value 7 not found\n");
    }
    int minVal = findMin(root);
    printf("Minimum value: %d\n", minVal);
    int maxVal = findMax(root);
    printf("Maximum value: %d\n", maxVal);
    return 0;
}

        前序遍历结果:1,2,4,5,3,6,7

        中序遍历结果:4,2,5,1,6,7,3

        后序遍历结果:4,5,2,6,7,3,1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值