当前位置: 首页 > article >正文

考研要求掌握的C语言(二叉排序树专题)

 考研要求

        考二叉排序树的建树、查找、中序遍历代码题,删除在选择题出过,大题可能会考

二叉排序树(二叉搜索树)(二叉查找树)的含义

        就是左子树的任意节点   小于根节点   小于右子树的任意节点

二叉排序树的建树

版本1:递归版本

建树的大概流程就是进行比较数据,若比根节点小,就去左子树

                                                          若比根节点大,就去右子树

动图示意

 

核心代码

//核心函数:构造二叉排序树,此版本为递归版本
int bst_insert(BTree& root, int val)
{
    //每次新来一个先建一个新节点
    BTree newTree = (BTree)calloc(1, sizeof(Tnode));
    newTree->val = val;
    if (root == NULL)
    {
        root = newTree;
        return 1;//插入成功
    }
    if (val > root->val)
    {
        return bst_insert(root->rc, val);
    }
    else if(val < root->val)
    {
        return bst_insert(root->lc, val);
    }
    else
    {
        return 0;//考研不考相等元素的插入
    }
}

【注】理解递归的宏观思路,就是你相信他能帮你完成你想要的事情以及注意结束条件即可

 二叉排序树的中序遍历

和之前二叉树专题的一样,就不再过多赘述了

二叉树专题

//中序遍历
void mid_print(BTree t)
{
    if (t)
    {
        mid_print(t->lc);
        printf("%d ", t->val);
        mid_print(t->rc);
    }
}

二叉排序树的查找

查找和建树的思想差不多,若比根节点小,就去左子树

                                           若比根节点大,就去右子树

//查找不修改,可以不加引用,既使加引用,下方用了临时指针指向,改变临时指针也不会改变tree
void find_tree(BTree tree,ElemType key)
{
    BTree cur = tree;//临时指针
    while (cur)
    {
        if (key > cur->val)
        {
            //右子树
            cur = cur->rc;
        }
        else if (key < cur->val)
        {
            cur = cur->lc;
        }
        else
        {
            printf("在二叉排序树中找到了%d\n",key);
            break;
        }
    }
}

可运行代码全部

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
//树结构体
typedef struct tree_node {
    ElemType val;
    struct tree_node* lc;
    struct tree_node* rc;
}Tnode, * BTree;
//注意:考研是会考二叉排序树的建树函数的
//二叉排序树也称为二叉搜索树(二叉查找树)
//特点,左子树都小于根节点,小于右子树
//考中序遍历,查找


//核心函数:构造二叉排序树,此版本为递归版本
int bst_insert(BTree& root, int val)
{
    //每次新来一个先建一个新节点
    BTree newTree = (BTree)calloc(1, sizeof(Tnode));
    newTree->val = val;
    if (root == NULL)
    {
        root = newTree;
        return 1;//插入成功
    }
    if (val > root->val)
    {
        return bst_insert(root->rc, val);
    }
    else if(val < root->val)
    {
        return bst_insert(root->lc, val);
    }
    else
    {
        return 0;//考研不考相等元素的插入
    }
}


void create_bst_tree(BTree &root,int *nums,int len)
{
    for (int i = 0; i < len; ++i)
    {
        bst_insert(root, nums[i]);//核心函数
    }
}
//中序遍历
void mid_print(BTree t)
{
    if (t)
    {
        mid_print(t->lc);
        printf("%d ", t->val);
        mid_print(t->rc);
    }
}

//查找
void find_tree(BTree tree,ElemType key)
{
    BTree cur = tree;
    while (cur)
    {
        if (key > cur->val)
        {
            //右子树
            cur = cur->rc;
        }
        else if (key < cur->val)
        {
            cur = cur->lc;
        }
        else
        {
            printf("在二叉排序树中找到了%d\n",key);
            break;
        }
    }
}



int main()
{
    BTree trees = NULL;
    int nums[] = { 15,25,65,2,89 };
    int len = (int)sizeof(nums) / sizeof(nums[0]);
    create_bst_tree(trees, nums,len);
    mid_print(trees);
    puts("");
    find_tree(trees, 65);
    return 0;
}

代码运行图

代码删除在下节,比较复杂


http://www.kler.cn/a/375635.html

相关文章:

  • ubuntu知识点滴积累
  • 封装一个请求的hook(react函数组件)
  • xlrd.biffh.XLRDError: Excel xlsx file; not supported
  • 「Mac畅玩鸿蒙与硬件8」鸿蒙开发环境配置篇8 - 应用依赖与资源管理
  • Ansible基本使用
  • openai api 文件分析/联网/画图代码示例
  • blender 小车建模 建模 学习笔记
  • C++之多态(上)
  • [实时计算flink]CREATE TABLE AS(CTAS)语句
  • 部署服务器监控集群之“Prometheus Grafana Alertmanager“
  • 智慧城市:未来城市的蓝图
  • Jupyter Notebook 打开指定文件夹
  • Straightforward Layer-wise Pruning for More Efficient Visual Adaptation
  • 用示波器如何测量信号的相位差?
  • 鸿蒙系统不断发展的看法
  • Python实现Lucas-Lehmer测试
  • Android 滴滴面经
  • No.22 笔记 | WEB安全 - 任意文件绕过详解 part 4
  • 深入理解数据库的三范式
  • OpenCV—HoughLines中的theta角度理解
  • ArcGIS Pro SDK (二十一)渲染
  • CSP/信奥赛C++刷题训练:经典差分例题(3):洛谷P5542 :[USACO19FEB] Painting The Barn S
  • fastboot相关的命令大全
  • 计算机后台服务-更新下载,重启————未来之窗行业应用跨平台架构
  • Notepad++检索包含多个关键字的行
  • 【django】RESTful API 设计指南