首页 > 其他分享 >BST二叉查找树的接口设计

BST二叉查找树的接口设计

时间:2024-04-29 23:33:06浏览次数:22  
标签:结点 BSTnode BST 二叉 查找 BSTree New 节点

/********************************************************************************************************
*
*
* 设计BST二叉查找树的接口,为了方便对二叉树进行节点的增删,所以采用双向不循环链表实现,每个节点内部都需要
* 有2个指针,分别指向该节点的左子树(lchild)和右子树(rchild)
*
* 
*
* Copyright (c)  2023-2024   [email protected]   All right Reserved
* ******************************************************************************************************/


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

#include "drawtree.h"


#if 0
//指的是BST树中的结点有效键值的数据类型,用户可以根据需要进行修改
typedef int  DataType_t;


//构造BST树的结点,BST树中所有结点的数据类型应该是相同的
typedef struct BSTreeNode
{
	DataType_t  		 data; 	//节点的键值
	struct BSTreeNode	*lchild; 	//左子树的指针域
	struct BSTreeNode	*rchild; 	//右子树的指针域

}BSTnode_t;
#endif

//创建一个带根节点的BST树,对BST树的根节点进行初始化
BSTnode_t * BSTree_Create(DataType_t KeyVal)
{
	//1.创建一个根结点并对根结点申请内存
	BSTnode_t *Root = (BSTnode_t *)calloc(1,sizeof(BSTnode_t));
	if (NULL == Root)
	{
		perror("Calloc memory for Root is Failed");
		exit(-1);
	}

	//2.对根结点进行初始化,根节点的2个指针域分别指向NULL
	Root->data = KeyVal;
	Root->lchild = NULL;
	Root->rchild = NULL;

	//3.把根结点的地址返回即可
	return Root;
}

//创建新的结点,并对新结点进行初始化(数据域 + 指针域)
BSTnode_t * BSTree_NewNode(DataType_t KeyVal)
{
	//1.创建一个新结点并对新结点申请内存
	BSTnode_t *New = (BSTnode_t *)calloc(1,sizeof(BSTnode_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

	//2.对新结点的数据域和指针域(2个)进行初始化
	New->data = KeyVal;
	New->lchild = NULL;
	New->rchild = NULL;

	return New;
}

//向BST树中加入节点   规则:根节点的左子树的键值都是比根节点小的,根节点的右子树的键值都是比根节点大的
bool BSTree_InsertNode(BSTnode_t *Root,DataType_t KeyVal)
{

	//为了避免根节点地址丢失,所以需要对地址进行备份
	BSTnode_t *Proot = Root;


	//1.创建新节点并对新结点进行初始化
	BSTnode_t * New = BSTree_NewNode(KeyVal);
	if (NULL == New)
	{
		printf("Create NewNode Error\n");
		return false;
	}

	//2.此时分析当前的BST树是否为空树,有2种情况(空树 or 非空树)
	if (NULL == Root)
	{
		//此时BST树为空树,则直接把新节点作为BST树的根节点
		Root = New;
	}
	else
	{
		while(Proot)
		{
			
			//新节点的键值和根节点的键值进行比较,如果相等则终止函数
			if (Proot->data == New->data)
			{
				printf("Can Not Insert,.....\n");
				return false;
			}
			//新节点的键值和根节点的键值进行比较,如果不相等继续分析
			else
			{
				//新节点的键值小于根节点的键值,则把根节点的左子树作为新的根
				if( New->data < Proot->data )
				{
					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;
}


int main(int argc, char const *argv[])
{
	//1.创建一个带根节点的BST树
	BSTnode_t *root =  BSTree_Create(10);

	//2.向BST树中插入新节点
	BSTree_InsertNode(root,5);
	BSTree_InsertNode(root,20);
	BSTree_InsertNode(root,7);
	BSTree_InsertNode(root,12);
	BSTree_InsertNode(root,8);
	BSTree_InsertNode(root,3);
	BSTree_InsertNode(root,25);
	BSTree_InsertNode(root,11);

	
	
	return 0;
}

标签:结点,BSTnode,BST,二叉,查找,BSTree,New,节点
From: https://www.cnblogs.com/bell-c/p/18166852

相关文章

  • 二叉树笔试题解题思路
    数据结构二叉树笔试题:解题思路:1.判断是否为空树,若为空树,则返回0;2.定义两个指针备份根结点地址,定义两个整型变量a,b并初始化为0,记录左右子树的深度;先对根结点的左子树进行遍历,若根结点的左结点不为NULL,则a++,把根结点的左结点赋值为新的根结点,再进行上述操作,若根结点的左结点......
  • 数据结构-二叉树的初始化
    数据结构-二叉树的相关初始化/*************************************************/***@filename: DcirLLinkInsert*@brief对双向循环链表插入的功能实现*@[email protected]*@date2024/04/29*@version1.0:在下坂本,有何贵干*@property:none......
  • 二分查找的左闭右开和左闭右闭写法
    0.参考参考链接:二分查找的左闭右开和左闭右闭写法1.思路0.序言lower_bound查找的是升序序列中的第一个出现target的pos,区间应从右向左收缩。upper_bound查找的是升序序列中的最后一个出现target的pos,区间应从左向右收缩。主循环判断本质目的是为了确保整个区间能够被检索......
  • 41天【代码随想录算法训练营34期】第九章 动态规划part03 (● 343. 整数拆分 ● 96.
    343.整数拆分classSolution:defintegerBreak(self,n:int)->int:dp=[0]*(n+1)dp[2]=1foriinrange(3,n+1):forjinrange(1,i//2+1):dp[i]=max(dp[i],(i-j)*j,dp[i-j]*j)......
  • 查找datafocus安装路径
    1.cat/etc/profile|grepDATA   2.解读下面一行master-192-168-0-15:/df-share表示该文件系统是通过网络文件系统(NFS)挂载的,其位置为master-192-168-0-15主机上的/df-share目录实际上,在主机上并没有名为/df-share的目录,这是一个挂载点的名称,而不是实际的目......
  • [题解]P2015 二叉苹果树
    P2015二叉苹果树树形dp,一般用dfs辅助解决。当我们搜索到\(u\),此时剩下\(cnt\)条边可以用,也就是说\(u\)为根节点的子树最多可以保留\(cnt\)条边。由于上一层的需求,我们显然需要枚举剩余边数\(i\)(\(1\leqi\leqcnt\))。接下来对于每个\(i\),我们考虑剩余的\(u\)条边可以怎么放。......
  • ABC347B Substring
    题目描述给你一个由小写英文字母组成的字符串S,S有多少个不同的非空子串?子串是连续的子序列。例如,xxx是yxxxy的子串,但不是xxyxx的子串。数据范围:S是长度在1和100之间(含)的字符串,由小写英文字母组成。题解我认为这道题放在普及组的话,非常适合放在第一题和第二题之间,......
  • 查找链表倒数第k个数位置上的结点
    (1)描述算法的基本思想由题可知,该链表是个单向链表,如果要找到倒数第k个值,我们必须找到该链表的尾部,而单向链表从尾部向头部找倒数第k个值比较麻烦,所以我们可以从头部去找倒数第k个值(2)描述算法的详细实现步骤我们可以利用两个指针去遍历该链表,一个指针遍历完该链表计算出结点个数......
  • 如何用Sublime Text实现正则查找与替换
    比如将下面的汉字语义加上中括号[{"text":"微笑","path":"emot01.png"},{"text":"大笑","path":"emot02.png"},{"text":"鼓掌","......
  • [python省时间]处理文档,包括批量查找,替换,
    1、批量查找替换#-*-coding:utf-8-*-importosimportre#path=os.getcwd()str_old='insert'str_new='frs.event.queue'file_formate='init.sql'file_sql=open(r'F:\bak\init_all.sql','r+',encoding=......