IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 王道数据结构自学-二叉排序树(二叉查找树) -> 正文阅读

[数据结构与算法]王道数据结构自学-二叉排序树(二叉查找树)

王道数据结构自学-二叉排序树(二叉查找树)

二叉排序树就是将比结点大的值放在右结点,比结点小的值放在左结点。

// 构建树的结构
typedef int KeyType;
typedef struct BSTNode
{
	KeyType key;
	BSTNode* lchild;//树的左孩子结点
	BSTNode* rchild;//树的右孩子结点
}BSTNode, * BiTree;

1 插入

  1. 首先判断被插入的结点是否存在,不存在的话先给这个结点申请空间初始化(将左右孩子置空,数值等于要插入的值)
  2. 如果存在,看一下元素是否一样,一样就不插入了
  3. 如果存在且值不一样,值小于结点的值就放入左子树,反之放入右子树
int BST_Insert(BiTree& T, KeyType k) {
	if (NULL == T) {
		//为新结点申请空间,第一个结点作为树根
		T = (BiTree)malloc(sizeof(BSTNode));
		T->key = k;
		T->lchild = T->rchild = NULL;
		return 1;//代表插入成功
	}
	else if (k == T->key) {
		return 0;//元素相同就不插入
	}
	else if(k < T->key)
	{
		return BST_Insert(T->lchild, k);
	}
	else
	{
		return BST_Insert(T->rchild, k);
	}
}

2 创建

  • 创建就是循环插入的过程
void Creat_BST(BiTree& T, KeyType str[], int n) {
	T = NULL;
	int i = 0;
	while (i < n) {
		BST_Insert(T, str[i]);//把某一个结点放入二叉树
		i++;
	}
}

3 查找

查找就是根据要查找的值比结点大还是比结点小的关系进行查找的过程。比结点大就要去右孩子查找,比结点小就要求左孩子查找,直至遍历完。

BSTNode* BST_Search(BiTree T, KeyType key, BiTree& p) {
	p = NULL;//存储要找的结点的父亲
	while (T != NULL && key != T->key) {
		p = T;
		if (key < T->key) {
			T = T->lchild;//比当前结点小,就左边找
		}
		else
		{
			T = T->rchild;//比当前结点大,就右边找
		}
	}
	return T;
}

4 删除

理解原理即可,考察代码几率不大

  • 被删除结点的左子树存在,右子树为空,左子树直接顶替结点
  • 被删除结点的左子树为空,右子树存在,右子树直接顶替结点
  • 被删除结点的左右子树都存在,采取用左子树最大值或者右子树最小值顶替结点的方法,选一个即可
void DeleteNode(BiTree& root, KeyType x) {
	if (root == NULL) {
		return;
	}
	if (root->key > x) {
		DeleteNode(root->lchild, x);
	}
	else if (root->key < x) {
		DeleteNode(root->rchild, x);
	}
	else//找到了要删除的结点
	{
		if (root->lchild == NULL) {//左子树为空,右子树直接顶上去
			BiTree tempNode = root;//用临时的存着的目的是一会要给他free
			root = root->rchild;
			free(tempNode);
		}
		else if (root->rchild == NULL) {//右子树为空,左子树直接顶上去
			BiTree tempNode = root;
			root = root->lchild;
			free(tempNode);
		}
		else//左右子树都不为空
		{//一般的删除策略是:左子树的最大数据 或 右子树的最小数据 代替删除的结点
			//这里采用使用左子树最大数据代替删除结点的方法
			BiTree tempNode = root->lchild;
			if (tempNode->rchild == NULL) {
				tempNode = tempNode->rchild;
			}
			root->key = tempNode->key;
			DeleteNode(root->lchild, tempNode->key);
		}
	}
}

点击下载源码

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:09:52  更:2022-07-20 19:12:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:29:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码