BST二叉查找树

news/2025/3/18 15:18:25/文章来源:https://www.cnblogs.com/xiaren/p/18778991

BST二叉查找树

  1. 二叉查找树的创建以及初始化
  2. 二叉查找树节点插入
    • 二叉查找树:左<根<右
  3. 二叉查找树的节点数、深度、叶子节点数(递归)
  4. 二叉查找树的先、中、后序遍历
    • 先序遍历:根左右
    • 中序遍历:左根右
    • 后序遍历:左右根
/*****************************************************
*   file name:sequencelist.c
*   author   :zzlyx1239@126.com
*   date     :2025.3.18
*   brief    :BST二叉查找树
*   note     :none
*
*   Copyright (c) 2025 zzlyx1239@126.com All Right Reserved
*
*******************************************************/#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>//设计BST的接口,为了方便对二叉树进行节点的增删,所以采用双向不循环链表实现,每个节点都有两个指针,分别指向左子树lchild和右子树rchild
//BST树中有效键值的数据类型,用户可以根据需要修改
typedef int  DataType_t;
//BST树的节点
typedef struct BSTreeNode
{DataType_t         data;//节点的键值struct BSTreeNode *lchild;//节点的左孩子指针域struct BSTreeNode *rchild;//节点的右孩子指针域
}BSTNode_t;//创建一个带根节点的BST树,对根节点初始化(数据域+指针域)
BSTNode_t * BSTree_Creat(DataType_t data)
{//为根节点申请堆内存空间BSTNode_t *Root=(BSTNode_t*)calloc(1,sizeof(BSTNode_t));if(Null==Root){perror("calloc for Root memory is Failed!!! ");exit(-1);}//对根节点初始化Root->data=data;Root->lchild=NULL;Root->rchild=NULL;return Root;
}//创建新的结点,并对新结点进行初始化(数据域 + 指针域)
BSTNode_t * BSTree_NewNode(BSTNode_t *Root,DataType_t data)
{//为新节点申请堆内存空间BSTNode_t *New=(BSTNode_t*)calloc(1,sizeof(BSTNode_t));if(Null==New){perror("calloc for New memory is Failed!!! ");exit(-1);}//对新节点初始化New->data=data;New->lchild=NULL;New->rchild=NULL;return New;	
}//向BST二叉树中插入新节点  规则:根节点的左子树的键值都是比根节点小的,根节点的右子树的键值都是比根节点大的
bool BSTree_InsertNode(BSTNode_t *Root,DataType_t destval)
{//为了避免根节点地址丢失,所以需要对地址进行备份BSTnode_t *Proot = Root;//1.为新节点申请内存空间New=BSTree_NewNode(Root,destval);if (NULL == New){printf("Create NewNode Error\n");return false;}//2.判断根节点是否存在,根节点不存在,新插入的节点作为根节点if(Root==NULL){Root=New;}else//{while(Proot)//根节点存在,如果新节点的值比根的值大,就在右子树找,反则就在左子树找{if(Proot->data==destval)//如果和根节点的值相等,插入失败{printf("Can Not Insert\n");return false;}else{if(Proot->data>destval){if(Proot->lchild==NULL){Proot->lchild=New;break;}Proot=Proot->lchild;}else{if(Proot->rchild==NULL){Proot->rchild=New;break;}Proot=Proot->rchild;}}}}return true;}//BST二叉树节点的数量
int BSTree_NodeNum(BSTNode_t *Root)
{int n1,n2;//n1为左子树节点数量,n2为右子树节点数量//1.判断树是否为空,如果为空返回0if(Root==NULL){return 0;}n1=BSTree_NodeNum(Root->lchild);n2=BSTree_NodeNum(Root->rchild);return n1+n2+1;
}//叶子节点数量
int BSTree_LeafNodeNum(BSTNode_t *Root)
{int n1,n2;记录左右叶子节点数量//终止条件if(Root=NULL){return 0;}elseif(Root->lchild=NULL&&Root->rchild){return 1;}else{n1=BSTree_LeafNodeNum(Root->lchild);n2=BSTree_LeafNodeNum(Root->rchild);}return n1+n2;
}//树的深度
int BSTree_GetDepth(Root)
{int n1,n2;//定义左右子树的高度//1.定义左右子树的结束条件if(Root=NULL){//空树,返回0return 0;}elseif(Root->lchild==NULL&&Root->rchild->NULL){//只有根节点返回1return 1;}else{n1=BSTree_GetDepth(Root->lchild);n2=BSTree_GetDepth(Root->rchild);}return (n1>n2?n1:n2)+1;
}//先序遍历 根左右
bool BSTree_PreOrder(BSTNode_t Root)
{//使用递归函数,写好终止条件if(NULL=Root){return false;}//输出根节点printf("keyval=%d\n",Root->data);//输出左子树BSTree_PreOrder(Root->lchild);//输出右子树BSTree_PreOrder(Root->rchild);
}//中序遍历 左根右
bool BSTree_InOrder(BSTNode_t Root)
{//使用递归函数,写好终止条件if(NULL=Root){return false;}//输出左子树BSTree_PreOrder(Root->lchild);//输出根节点printf("keyval=%d\n",Root->data);//输出右子树BSTree_PreOrder(Root->rchild);
}//后序遍历 左右根
bool BSTree_PostOrder(BSTNode_t Root)
{//使用递归函数,写好终止条件if(NULL=Root){return false;}//输出左子树BSTree_PreOrder(Root->lchild);//输出右子树BSTree_PreOrder(Root->rchild);//输出根节点printf("keyval=%d\n",Root->data);}
int main()
{return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900961.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用cursor打造智能客服demo

cursor AI它真的是非常强大。 今天讲下如何使用它,搭配deepseek api接口,来生成一个智能客服系统。这是最终的效果。首先cursor需要登录后才能使用。登录之后有两周的免费试用期。我们在窗口的右侧填写智能客服的需求。帮我实现一个网页智能客服。详细要求如下: 1.生成一个h…

【蓝牙小程序】小程序使用echart图表报错:setOption of undefined

转载自:https://developers.weixin.qq.com/community/develop/doc/0004ac054ccec0f26df7baa8756800问题:小程序使用echart图表报错 Cannot read property setOption of undefined;at api request success callback function TypeError: Cannot read property setOption of un…

前端中的Javascript

前端中的Javascript javascript定义方式内联JavaScript直接在HTML元素的事件属性中编写JavaScript代码<body><h1>Hello, World!</h1><button onclick="alert(Button clicked!)">Click Me</button> </body>内部JavaScript可以直接…

NVM:安装配置使用

一、简介 在实际的开发和学习中可能会遇到不同项目的 node 版本不同,而出现的兼容性问题。 而 nvm 就可以很好的解决这个问题,它可以在同一台机器上下管理多个 node 版本,使得程序员可以轻松地安装、卸载和切换不同的 node 版本。 在下载和配置 nvm 前,需要在控制面板中先删…

硬盘科普,M.2,PCI-E,NVMe 傻傻分不清

首先从三个层面去理解这个问题:物理接口,通道,协议 1:物理接口(相当于通讯中的电,光口) 大白话- 物理规格,像是 公路,铁路 专门跑PCI-E通道的那个物理接口:扩展性极强,可以插显卡的PCI-E X16的那个物理接口,或者插网卡,声卡的那个PCI-E X1那个物理接口,都是属于一类…

第二届长城杯ciscn半决赛awdp pwn以及应急响应wp

这次半决赛还真是状况频出,先是上午全场靶机断联了2轮,下午的应急又在坐大牢,还好是后面捋顺了逻辑做出来了,下半场干了个赛区第二,总成绩第四,这回是真燃尽了 上半场AWDP typo fix 一开始一直在改这道结果后面才发现那个prompt是真的好改,白浪费了3轮。。。 进入程序是…

LLM Assistance for Memory Safety

LLM Assistance for Memory SafetyMohammed, Nausheen, et al. "LLM Assistance for Memory Safety." 2025 IEEE/ACM 47th International Conference on Software Engineering (ICSE). IEEE Computer Society, 2024.Introduction 在软件安全的漏洞中,内存安全是主要…

『Plotly实战指南』--折线图绘制进阶篇

上一篇介绍了Plotly绘制折线图的基础知识和数据预处理的技巧, 本文将重点探讨如何利用Plotly实现多线折线图的布局设计以及动态折线图的实现, 让我们一起掌握进阶的折线图绘制技巧。 1. 多折线图布局 在实际的数据分析场景中,常常需要同时展示多组数据,例如对比不同产品的销…

使用gradio快速实现聊天机器人

我们可以使用gradio库通过低代码的方式快速实现聊天机器人界面及交互: import gradio as gr from ollama import chatdef predict(message,history):stream = chat(model="deepseek-r1:1.5b",messages=[{"role":"user","content":mess…

Edge浏览器登录微软账户报错0x80190001的解决办法

问题 0x80190001是什么错误?有用户在Edge浏览器上登录微软账户遇到了这个错误代码,这是什么意思?要如何解决呢?一个比较靠谱的解决办法解决方式1、下载一个finder(抓包软件)官网下载地址(最新版本):https://www.telerik.com/download/fiddler2、直接安装就好,选择左上…

2025年项目管理软件革命:7大工具重新定义团队协作

本文深度解析2025年项目管理工具的技术革新与市场格局,聚焦AI、量子计算、混合现实等技术对团队协作模式的颠覆性影响。一、2025年项目管理生态的三大颠覆性变化 在生成式AI、量子计算与混合现实技术推动下,项目管理工具正经历三大变革:决策权转移:AI从辅助工具升级为“虚拟…

【前瞻技术布局】京东零售广告创意:引入场域目标的创意图片生成

作者:京东零售 冯伟WWW2025: CTR-Driven Advertising Image Generation with Multimodal Large Language Models 论文链接:https://arxiv.org/pdf/2502.06823 代码链接:https://github.com/Chenguoz/CAIG 摘要:在电商平台中,广告图片对于吸引用户注意力和提高广告效果至关…