C语言 二叉查找树性质详解及实例代码

C语言二叉查找树性质详解及实例代码

什么是二叉查找树?

二叉查找树,也称二叉搜索树,它是一种基于对比的动态数据结构。它的定义如下:

  • 每个节点都包含一个键值,且键值唯一;
  • 每个节点的左子树只包含小于当前节点的节点;
  • 每个节点的右子树只包含大于当前节点的节点;
  • 左右子树都是二叉搜索树;

二叉查找树的性质

二叉查找树的性质体现在它的增、删、查等操作中,具体有以下几种性质:

  • 查找节点:在二叉查找树中查找一个节点,首先查找根节点,如果查找值等于根节点的键值,则查找结束;如果查找值小于根节点的键值,则在左子树中继续查找;如果查找值大于根节点的键值,则在右子树中继续查找。

  • 插入节点:在二叉查找树中插入一个节点,首先查找根节点,如果查找值等于根节点的键值,则插入失败;如果查找值小于根节点的键值,则在左子树中继续查找;如果查找值大于根节点的键值,则在右子树中继续查找,直到找到一个空节点,将新节点插入到该节点处。

  • 删除节点:在二叉查找树中删除一个节点,首先查找要删除的节点,如果该节点没有子节点,则直接删除;如果该节点只有一个子节点,则将该节点的子节点替换该节点;如果该节点有两个子节点,则用该节点的后继节点(即右子树中最小的节点)替换该节点,然后删除该后继节点。

  • 中序遍历:中序遍历二叉查找树可以得到一个递增的有序序列。

二叉查找树实现过程

以下是C语言实现二叉查找树的过程,包括插入和查找操作。

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

/* 二叉查找树定义 */
typedef struct _node {
    int key;
    struct _node *left;
    struct _node *right;
} Node, *Tree;

/* 查找节点 */
Node* search(Tree t, int key) {
    if (t == NULL) {
        return NULL;
    }

    if (key == t->key) {
        return t;
    } else if (key < t->key) {
        return search(t->left, key);
    } else {
        return search(t->right, key);
    }
}

/* 插入节点 */
Node* insert(Tree t, int key) {
    /* 建立新节点 */
    Node *p = (Node*)malloc(sizeof(Node));
    p->key = key;
    p->left = NULL;
    p->right = NULL;

    /* 查找插入位置 */
    if (t == NULL) {
        t = p;
    } else if (key < t->key) {
        t->left = insert(t->left, key);
    } else if (key > t->key) {
        t->right = insert(t->right, key);
    }

    return t;
}

/* 中序遍历 */
void inorder(Tree t) {
    if (t != NULL) {
        inorder(t->left);
        printf("%d ", t->key);
        inorder(t->right);
    }
}

/* 测试入口 */
int main() {
    Tree t = NULL;

    t = insert(t, 5);
    t = insert(t, 3);
    t = insert(t, 7);
    t = insert(t, 1);
    t = insert(t, 9);

    Node *search_node = search(t, 7);
    if (search_node != NULL) {
        printf("Found node key=%d\n", search_node->key);
    } else {
        printf("Not found\n");
    }

    printf("Inorder traversal: ");
    inorder(t);

    return 0;
}

二叉查找树使用示例1

以下是一个示例代码,它演示了如何使用二叉查找树来存储整数,并输出各整数。

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

/* 二叉查找树定义 */
typedef struct _node {
    int key;
    struct _node *left;
    struct _node *right;
} Node, *Tree;

/* 插入节点 */
Node* insert(Tree t, int key) {
    /* 建立新节点 */
    Node *p = (Node*)malloc(sizeof(Node));
    p->key = key;
    p->left = NULL;
    p->right = NULL;

    /* 查找插入位置 */
    if (t == NULL) {
        t = p;
    } else if (key < t->key) {
        t->left = insert(t->left, key);
    } else if (key > t->key) {
        t->right = insert(t->right, key);
    }

    return t;
}

/* 中序遍历 */
void inorder(Tree t) {
    if (t != NULL) {
        inorder(t->left);
        printf("%d ", t->key);
        inorder(t->right);
    }
}

/* 测试入口 */
int main() {
    Tree t = NULL;

    t = insert(t, 5);
    t = insert(t, 3);
    t = insert(t, 7);
    t = insert(t, 1);
    t = insert(t, 9);

    printf("Inorder traversal: ");
    inorder(t);

    return 0;
}

输出结果如下:

Inorder traversal: 1 3 5 7 9

二叉查找树使用示例2

以下是一个验证二叉查找树的例子,它演示了如何判断一个树是否是二叉查找树以及如何验证一个节点是否是其子树的最大最小值之间。

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

/* 二叉查找树定义 */
typedef struct _node {
    int key;
    struct _node *left;
    struct _node *right;
} Node, *Tree;

/* 插入节点 */
Node* insert(Tree t, int key) {
    /* 建立新节点 */
    Node *p = (Node*)malloc(sizeof(Node));
    p->key = key;
    p->left = NULL;
    p->right = NULL;

    /* 查找插入位置 */
    if (t == NULL) {
        t = p;
    } else if (key < t->key) {
        t->left = insert(t->left, key);
    } else if (key > t->key) {
        t->right = insert(t->right, key);
    }

    return t;
}

/* 中序遍历 */
void inorder(Tree t) {
    if (t != NULL) {
        inorder(t->left);
        printf("%d ", t->key);
        inorder(t->right);
    }
}

/* 验证二叉查找树 */
bool is_bst(Tree t, int min, int max) {
    if (t == NULL) {
        return true;
    }

    if (t->key <= min || t->key >= max) {
        return false;
    }

    return is_bst(t->left, min, t->key) && is_bst(t->right, t->key, max);
}

/* 测试入口 */
int main() {
    Tree t = NULL;

    t = insert(t, 5);
    t = insert(t, 3);
    t = insert(t, 7);
    t = insert(t, 1);
    t = insert(t, 9);

    printf("Inorder traversal: ");
    inorder(t);

    if (is_bst(t, INT_MIN, INT_MAX)) {
        printf("\nTree %p is a binary search tree\n", t);
    } else {
        printf("\nTree %p is NOT a binary search tree\n", t);
    }

    return 0;
}

输出结果如下:

Inorder traversal: 1 3 5 7 9 
Tree 0x7f9161401690 is a binary search tree

以上就是二叉查找树的介绍和示例代码,希望能够对读者理解和使用它有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 二叉查找树性质详解及实例代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • C++中四种对象生存期和作用域以及static的用法总结分析

    C++中四种对象生存期和作用域以及static的用法总结分析 在C++中,对象是程序中的基本组成单位之一。对象有不同的生存期和作用域,对于理解C++程序的运行过程至关重要。static是一个关键字,它有多种用途。本文将详细介绍C++中四种对象生存期和作用域以及static的用法。 对象的生存期和作用域 C++中的对象根据生存期和作用域的不同可以分为以下四类:…

    C 2023年5月22日
    00
  • C语言求字符串长度的四种方法实例代码

    下面是针对“C语言求字符串长度的四种方法实例代码”这个主题的完整攻略: 一、背景 在C语言中,获取字符串长度是一个比较基础的操作,它在很多情况下都非常有用。本文将介绍四种常见的C语言获取字符串长度的方法,逐一进行讲解和实例演示。 二、方法一:使用strlen()函数 strlen()函数是C语言中用于获取字符串长度的标准函数,它的使用非常简单,直接传入字符串…

    C 2023年5月24日
    00
  • Qt如何实现输入框@联系人的@检测的示例

    下面是Qt如何实现输入框@联系人的@检测的完整攻略: 准备工作 在开始示例前,需要先安装Qt的开发环境,并且熟悉Qt的基础知识(如信号槽、QLineEdit控件等)。如果你还不熟悉这些知识点,可以先学习Qt官方的文档或相关教程。 示例1:简单的@检测 首先,我们将创建一个简单的QLineEdit控件,用于演示@联系人的@检测功能。定义一个Qt信号量,用于回答…

    C 2023年5月23日
    00
  • C语言 strcpy()函数

    当我们需要对一个字符串进行复制的时候,可以使用C语言中的strcpy()函数。本文将详细介绍strcpy()函数的使用方法,并包含两个示例来帮助读者更好地了解其使用。 函数说明 strcpy()函数的原型如下: char *strcpy(char *dest, const char *src); 该函数的功能是将源字符串(src)复制到目标字符串(dest)…

    C 2023年5月9日
    00
  • 基于C语言实现学生成绩管理系统

    基于C语言实现学生成绩管理系统完整攻略 1. 掌握C语言基础 要实现学生成绩管理系统,首先需要掌握C语言的基础知识,包括控制流、函数、数组、结构体、指针等等。 2. 设计数据结构 根据学生成绩管理系统的需求,设计合适的数据结构来存储学生信息和成绩。可以使用结构体来存储学生信息,包括学号、姓名、性别、年龄等等;使用数组来存储学生成绩,每个元素代表一个学生的成绩…

    C 2023年5月23日
    00
  • C语言编写学生成绩管理系统

    下面是“C语言编写学生成绩管理系统”的完整攻略。 系统架构设计 在设计这个学生成绩管理系统时,我们考虑到用户会有以下几个需求: 添加学生信息 修改学生信息 删除学生信息 查询学生信息 对学生成绩进行操作(排序、统计等) 因此,我们将系统分成了三个模块,分别是学生信息模块、学生成绩操作模块和用户操作模块,其架构设计如下: graph LR A[学生信息模块] …

    C 2023年5月24日
    00
  • 非常经典的C语言趣味题目

    下面是“非常经典的C语言趣味题目”的完整攻略。 1.题目描述 题目描述:输入一个正整数n,按十进制输出n的二进制表示,并输出其中1的个数。 2.思路分析 1.输入一个正整数n;2.将n转换成二进制表示。对于十进制数,可以不断对2取余数和商,然后将余数倒序排列起来就可以得到二进制表示,具体可以使用循环实现;3.遍历二进制表示,数出其中1的个数。 3.代码实现 …

    C 2023年5月23日
    00
  • C++实现比特币系统的源码

    C++实现比特币系统的源码攻略 比特币系统是一个由开源社区共同维护的加密货币系统,其核心在于区块链技术。C++语言被广泛用于比特币系统开发,以下是 C++ 实现比特币系统的源码攻略: 一、搭建开发环境 搭建比特币系统开发环境需要准备以下工具: C++ 编辑器:推荐使用 Visual Studio Code 或者 Sublime Text; Git 工具:用于…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部