建立二叉搜索树

思路

一个简单的二叉搜索树(Binary Search Tree, BST)的实现。下面是对代码逐步分析

头文件包含:

 #include <stdio.h> :包含标准输入输出函数的声明。
 #include <stdlib.h> :包含内存分配和释放函数的声明。


二叉树节点结构定义:

 typedef struct TreeNode :定义了一个名为 TreeNode 的结构体,包含三个成员:

 int data 用于存储数据, 

struct TreeNode *left 和 struct TreeNode *right 分别指向左子节点和右子节点。


创建新节点函数:

 TreeNode* createNode(int data) :这个函数接受一个整数 data 作为参数,分配一个新的 TreeNode 结构体内存,

并将 data 存储在 newNode->data 中,

同时将 left 和 right 指针初始化为 NULL 。

如果内存分配失败( newNode == NULL ),则打印错误信息并退出程序。

 

插入节点函数:

 TreeNode* insertNode(TreeNode* root, int data) :这个函数接受一个二叉树的根节点 root 和一个整数 data 作为参数。如果 root 为 NULL (即树为空),则创建一个新节点并返回。如果 data 小于 root->data ,则递归地调用 insertNode 函数在左子树中插入 data ;如果 data 大于 root->data ,则递归地调用 insertNode 函数在右子树中插入 data 。这样确保了二叉搜索树的性质:左子树的所有节点的值小于根节点的值,右子树的所有节点的值大于根节点的值。


主函数:

 int main() :在主函数中,首先将 root 初始化为 NULL 。然后通过调用 insertNode 函数插入一系列的整数(50, 30, 20, 40, 70, 60, 80)到二叉树中。这些调用会根据每个整数的大小,将其插入到树中的适当位置,从而构建一个二叉搜索树。

 

总结来说,这段代码定义了一个二叉搜索树的数据结构,并实现了插入节点的功能。通过递归的方式,确保了插入的节点按照二叉搜索树的规则(左子树小于根,右子树大于根)进行排列。

 

代码:

#include <stdio.h>

#include <stdlib.h>

 

// 定义二叉树节点结构

typedef struct TreeNode {

    int data;

    struct TreeNode *left;

    struct TreeNode *right;

} TreeNode;

 

// 创建一个新的二叉树节点

TreeNode* createNode(int data) {

    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));

    if (newNode == NULL) {

        printf("Error! unable to create new node\n");

        exit(0);

    }

    newNode->data = data;

    newNode->left = NULL;

    newNode->right = NULL;

    return newNode;

}

 

// 插入节点到二叉树

TreeNode* insertNode(TreeNode* root, int data) {

    // 如果树为空,返回一个新节点

    if (root == NULL) {

        return createNode(data);

    }

 

    // 否则,递归地插入节点

    if (data < root->data) {

        root->left = insertNode(root->left, data);

    } else if (data > root->data) {

        root->right = insertNode(root->right, data);

    }

 

    return root;

}

 

// 主函数

int main() {

    TreeNode* root = NULL;

    root = insertNode(root, 50);

    insertNode(root, 30);

    insertNode(root, 20);

    insertNode(root, 40);

    insertNode(root, 70);

    insertNode(root, 60);

    insertNode(root, 80);

 

    return 0;

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值