萌新笔记之二叉搜索树(BST)
前言,以前搞过线段树,二叉树觉得也就那样= =、然后数据结构的课也没怎么听过,然后下周期中考。。。
本来以为今天英语考完可以好好搞ACM了,然后这个数据结构期中考感觉会丢人,还是好好学习一波。
二叉搜索树(BST,Binary Search Tree)
又称二叉排序树或二叉查找树。
二叉搜索树 是一棵二叉树,它可以为空。
特性(保证键值都不相同):
①:非空左子树的所有键值都小于根节点的键值;
②:非空右子树的所有键值都大于根节点的键值;
③:左右子树都是BST;
二叉树的遍历方式中序,后序,前序不说了。。
直接说与BST操作相关的操作吧。。。。。。(自以为是由易到难的顺序讲的)
定义
先小小地定义一下~
typedef int ElementType;
//ElementType 就是 int 的意思(要问我啥意思呢。。。就是你看ElementType这个词的意思:元素类型(是吧,我就看得懂type,前面瞎说是类型的意思,嘿嘿,平常用typedef就是为了偷懒。。)
typedef struct TNode *Position;
//这些小东西不多讲了= =、指针不会就先去学指针,话说弱弱有一个很不错的指针讲义。需要的可以联系。。
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
插入
感觉插入就比较好理解???(三个反问号强行理解)
前面已经说过左右结点键值和根结点键值的关系,
通俗地讲每次插入的时候比根的值小就放到左边(左儿子)去,比他大放到右边(右儿子)去;
细节方面还要考虑 这个BST是不是空的啊,还有以这个X值在这棵BST里面有没有啊;
思路就是比这个结点小看左边,比这个结点大看右边。如果传下来是空的就插。如果有这个值= =啥也不做;
代码来自数据结构陈越姥姥版,主要是单写这个函数的不敢自己瞎写误导读者。。。
BinTree Insert(BinTree BST,ElementType X)
{
if(BST==NULL) //如果是空,生成并返回一个结点的二叉搜索树;
{
BST=(BinTree)malloc(sizeof(struct TNode));
BST->Data=X;
BST->Left=BST->Right=NULL;
}
else
{
if(X<BST->Data) //比这个结点小看左边
BST->Left=Insert(BST->Left,X);
else if(X>BST->Data)
BST->Right=Insert(BST->Right,X); //比这个结点大看右边
}
//额。。这个理解嘛。①:如果这棵BST就是空的,那么你看直接创建,插然后返回,就是根节点对吧(这棵BST就一个结点;②:如果不是空的,那么就一直下去啊下去啊下去啊,搜到可以插的位置,插,返回的是插入结点。但是你可以看到中间的函数并没有接什么值,最后还是返回了根结点
return BST;
}
查找
插入也是蛮好理解,还是利用特性嘛。
对于给定的元素,就去找就好啦。还是和根结点比较一下,比他小就看左边,比他大就看右边,找到就返回呗。
细节就是本身就是一棵空树,那就直接返回空就好啦;
找到直接返回指针就好了;
Position Find(BinTree BST , ElementType X)
{
if(BST==NULL) return NULL; //如果是空,哈哈,直接返回NULL;
if(X>BST->Data) //如果比根的大看右边;
return Find(BST->Right,X);
else if(X<BST->Data) //如果比根的小看左边;
return Find(BST->Left,X);
else //这里就是找到啊,直接返回;
return BST;
}
查找最大最小元素
这里还有两个操作查找最小最大元素。
按照BST的特性我们就会知道,小的一直往左边偏,大的一直往右边偏。所以最小的就是最左边那个啊,最大就是最右边那个啊
查找最小:
Position FindMin(BinTree BST)
{
if(BST==NULL) return NULL; //如果是空的话,返回空啊;
if(BST->Left==NULL) //这就说明他是最左边的那个啊
return BST;
else
return FindMin(BST->Left); //左边还有就往左边去
}
查找最大:
Position FindMax(BinTree BST)
{
if(BST==NULL) return NULL;
if(BST->Right==NULL)
return BST;
else
return FindMax(BST->Right);
}
二叉搜索树的删除
1.如果待删除的结点没有孩子结点,那么直接删除就好了;
2.如果待删除的结点只有一个孩子结点,那么让孩子结点顶替他的位置;
3.如果待删除的结点有两个孩子结点,一种方法是拿左子树的最大元素来顶替他的位置,另一种方法是拿右子树的最小元素来顶替他的位置;
= =自己画画应该就懂了吧;
BinTree Delete(BinTree BST,ElementType X)
{
Position tmp;
if(BST==NULL)
{
printf("Not Found\n");
return BST;
}
if(X>BST->Data) //右子树递归删除
BST->Right=Delete(BST->Right,X);
else if(X<BST->Data) //左子树递归删除
BST->Left=Delete(BST->Left,X);
else //找到
{
if(BST->Left&&BST->Right) //如果左右子树都存在
{
tmp=FindMin(BST->Right); //在右子树找最小的元素顶替
BST->Data=tmp->Data;
BST->Right=Delete(BST->Right,BST->Data); //然后删除那个顶替元素(右子树的最小)
}
else //待删除的结点没有子结点或只有一个
{
tmp=BST;
if(BST->Left==NULL) //有右子结点,拿右顶替
BST=BST->Right;
else if(BST->Right==NULL) //有左子结点,那左顶替
BST=BST->Left;
free(tmp);
}
}
return BST; //最后返回,传下来的BST,因为一直都是递归啊~
}
萌新笔记之二叉搜索树(BST)的更多相关文章
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- 给定一个二叉搜索树(BST),找到树中第 K 小的节点
问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2. 递归使用 参考答案 ...
- 二叉搜索树(BST)学习笔记
BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...
- 二叉搜索树 (BST) 的创建以及遍历
二叉搜索树(Binary Search Tree) : 属于二叉树,其中每个节点都含有一个可以比较的键(如需要可以在键上关联值), 且每个节点的键都大于其左子树中的任意节点而小于右子树的任意节点的键. ...
- [LeetCode] Convert BST to Greater Tree 将二叉搜索树BST转为较大树
Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...
- 数据结构☞二叉搜索树BST
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它 ...
- 看动画学算法之:二叉搜索树BST
目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的非线性的数据结构. 树是由很多个节点组 ...
- 在二叉搜索树(BST)中查找第K个大的结点之非递归实现
一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...
- 二叉搜索树(BST)
(第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄.这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了 ...
随机推荐
- Linux 中权限的再讨论( 上 )
前言 在Linux系统中,用户分为三个部分( 所有者 同组人 其他 ).每个部分的权限又可以赋予读/写/执行权限.这样,文件的权限标记一共包含 9 个权限位.好了,很多朋友对于Linux权限的了解就仅 ...
- 图像处理之图像增强项目---csdn去雾专栏1
(一)高斯低通滤波去噪 高斯低通滤波器(Gaussian Low Pass Filter)是一类传递函数为高斯函数的线性平滑滤波器.又由于高斯函数是正态分布的密度函数.因此高斯低通滤波器对于去除服从正 ...
- numpy函数库中一些经常使用函数的记录
##numpy函数库中一些经常使用函数的记录 近期才開始接触python,python中为我们提供了大量的库,不太熟悉.因此在<机器学习实战>的学习中,对遇到的一些函数的使用方法进行记录. ...
- Android自己定义控件--下拉刷新的实现
我们在使用ListView的时候.非常多情况下须要用到下拉刷新的功能.为了了解下拉刷新的底层实现原理,我採用自己定义ListView控件的方式来实现效果. 实现的基本原理是:自己定义ListView, ...
- [ios]objective-c中Category类别(扩展类)专题总结
本文转载至 http://yul100887.blog.163.com/blog/static/20033613520126333344127/ objective-c类别的作用?通过类别的方式, ...
- 我在开发第一个Swift App过程中学到的四件事
本文转载至 http://www.itjhwd.com/wzkfyigeswiftsjs/ 译者注:本文作者Greg Heo,这是他为讲授iOS 8 App Extensions视频教程而实际使用Sw ...
- c# vs2010 连接access数据库
第一次在博客园写博文,由于文采不怎么好,即使是自己很熟悉的东西,写起来也会感觉到不知从何讲起,我想写的多了就好了. 这篇文章主要是介绍怎么用c# 语言 vs2010连接access数据库的,连接字符串 ...
- 5 Ways to Make Your Hive Queries Run Faster
5 Ways to Make Your Hive Queries Run Faster Technique #1: Use Tez Hive can use the Apache Tez execu ...
- Machine Learning in Action(5) SVM算法
做机器学习的一定对支持向量机(support vector machine-SVM)颇为熟悉,因为在深度学习出现之前,SVM一直霸占着机器学习老大哥的位子.他的理论很优美,各种变种改进版本也很多,比如 ...
- 1022. Fib数列
https://acm.sjtu.edu.cn/OnlineJudge/problem/1022 Description 定义Fib数列:1,1,2,3,5,8,13,…1,1,2,3,5,8,13, ...