//数组实现二叉树:
// 1.下标为零的元素为根节点,没有父节点
// 2.节点i的左儿子是2*i+1;右儿子2*i+2;父节点(i-1)/2;
// 3.下标i为奇数则该节点有有兄弟,否则又左兄弟
// 4.对bst树的操作主要有插入,删除,后继前驱的查找,树最大最小节点查看 #include <iostream> using namespace std; struct node{
node *p,*left,*right;
int key;
}; node * root = NULL; //中序输出BST中的全部关键字
void inorder_tree_walk(node * t)
{
if(t != NULL){
inorder_tree_walk(t->left);
cout<<t->key<<" ";
inorder_tree_walk(t->right);
}
return;
} //查找关键字k,若存在,则返回指向包含k的节点指针;否则,返回NULL
node * tree_search(node * t,int k)
{
while(t != NULL && t->key != k){
if(k < t->key) t = t->left;
else t = t->right;
}
return t;
} //查找最小关键字的节点
node * tree_minimum(node *t)
{
while(t->left != NULL)
t = t->left;
return t;
} //查找最大关键字的节点
node * tree_maximum(node *t)
{
while(t->right != NULL)
t = t->right;
return t;
} //查找节点z的后继
// 1.若该节点有有子树则其后继就是该节点有子树中最小节点
// 2.否则其后继就是其最低祖先节点
node * tree_successor(node * z)
{
if(z->right != NULL) //节点存在右子树
return tree_minimum(z->right);
node * y = z->p; //节点不存在右子树寻找最近祖先节点
while(y != NULL && z == y->right){
z = y;
y = y->p;
}
return y;
} //查找z的前驱节点
node * tree_precursor(node * z)
{
    if(z->left != NULL)
        return tree_maximum(z->left);
    node * y = z->p;
    while(y != NULL && z == y->left){
        z = y;
        y = y->p;
    }
    return y;
} //在BST中插入关键字的值为k的节点
// 1.插入节点时要寻找该节点的正确位置
// 2.然后插入该节点
void tree_insert(node * t,int k){
node * z = new node;
z->key = k;
z->left = NULL;
z->right = NULL;
z->p = NULL; node * y = NULL;
while(t != NULL){ //寻找该节点的正确位置
y = t;
if(z->key < t->key) t = t->left;
else t = t->right;
}
z->p = y; //插入该节点
if(y == NULL) root = z;
else if(z->key < y->key) y->left = z;
else y->right = z;
return;
} //用以v为根的子树替换以u为根的子树
void transplant(node * u, node *v)
{
if(u->p == NULL) root = v;
else if(u == u->p->left) u->p->left = v;
else u->p->right = v;
if(v != NULL) v->p = u->p;
return;
} //从BST中删除节点z
// 1.被删除的节点没有左儿子就用其有儿子来填补
// 2.被删除的节点仅有左儿子就用其左儿子来填补
// 3.有两个儿子的情况:
// a.先找出该节点的一个后继结点 y
// b.y是该节点的右儿子直接用y填补
// c.否则先用y的右孩子替换y,再用y替换被删节点
void tree_delete(node * z)
{
if(z->left == NULL)
transplant(z,z->right);
else if(z->right == NULL)
transplant(z,z->left);
else{
node * y = tree_minimum(z->right);
if(y->p != z){
transplant(y,y->right);
y->right = z->right;
y->right->p = y;
}
transplant(z,y);
y->left = z->left;
y->left->p = y;
}
return;
} int main(){ int a[]={,,,,,,,};
for(int i=;i<=;++i)
{
tree_insert(root,a[i]);
}
inorder_tree_walk(root);
cout<<endl;
cout<<"insert key = 13:"<<endl;
tree_insert(root,);
inorder_tree_walk(root);
cout<<endl;
cout<<"the min key is :"<<tree_minimum(root)->key<<endl;
cout<<"the max key is :"<<tree_maximum(root)->key<<endl;
cout<<"the 9's successor is :"<<tree_successor(tree_search(root,))->key<<endl;
cout<<"delete key =18 :"<<endl;
tree_delete(tree_search(root,));
inorder_tree_walk(root);
cout<<endl;
return ;
}

二叉搜索树:

  1.二叉搜索树是以一颗二叉树来组织的,可以用链表数据结构来实现表示,每个节点表示一个对象,每个节点包含的信息由其key值及其各方向的指向。

  2.对其遍历可用前中后序遍历,这里用的是中序遍历方法

  3.二叉搜索树的搜索方法:待查找的元素的键值比当前结点先就到当前结点的左树种去寻找,比当前节点大就到当前节点的右树中去寻找,否则就找到或者到叶子结点也没找到就返回null

  4.查找一棵树的最小元素和最大元素:最小元素救是以该节点为根节点的树的最左边的叶子节点,而最大元素就是以该节点为根节点的最右边的叶子结点

  5.查找按照中序遍历方法中一个节点的前驱和后继节点:

    a.前驱节点:情况一,该节点的左子树非空,则该节点的前驱节点就是该右子树中最大元素;情况二,该节点的左子树为空,那么该节点的后继结点就是沿这这个节点的父节点往上找,并且同时父节点和该节点都上移,直到当前结点是其父节点的右儿子为止,该父节点就是要找的前驱节点

    b.后继节点:情况一,该节点的右子树非空,则该节点的后继节点就是该右子树中最小元素;情况二,该节点的右子树为空,那么该节点的后继结点就是沿这这个节点的父节点往上找,并且同时父节点和该节点都上移,直到当前结点是其父节点的左儿子为止,该父节点就是要找的后继节点

    实际上前驱节点和后继结点的求法刚好相反

  6.插入节点:先找到给节点的正确位置,然后插入进搜索树中

  7.删除节点:比较麻烦,情况也比较复杂,因为在删除的过程中还要维护搜索树的性质

      a.被删除的节点只有右儿子,用右儿子来填补该节点

      b.被删除的节点只有左儿子,用左儿子来填补该节点

      c.被删除的节点没有儿子,则直接删除

      d.被删除的节点有两个儿子节点,先找到该节点的后继节点。情况一,如果该后继结点就是被删节点的右儿子,直接用该后继节点替换该节点;情况二,如果该后继节点位于被删节点的右子树中但不是被删节点的右儿子,先用该后继节点的右儿子替换该后继节点,再用该后继节点替换被删除的几点。

bst 二叉搜索树简单实现的更多相关文章

  1. 数据结构中很常见的各种树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B+树.B*树) 二叉排序树.平衡树.红黑树 红黑树----第四篇:一步一图一代码,一定要让你真正彻底明白红黑树 --- ...

  2. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树 ...

  3. [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  4. [LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  5. 浅析BST二叉搜索树

    2020-3-25 update: 原洛谷日报#2中代码部分出现一些问题,详情见此帖.并略微修改本文一些描述,使得语言更加自然. 2020-4-9 update:修了一些代码的锅,并且将文章同步发表于 ...

  6. 530 Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值.示例 :输入:   1    \     3    /   2输出:1解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...

  7. LeetCode #938. Range Sum of BST 二叉搜索树的范围和

    https://leetcode-cn.com/problems/range-sum-of-bst/ 二叉树中序遍历 二叉搜索树性质:一个节点大于所有其左子树的节点,小于其所有右子树的节点 /** * ...

  8. Leetcode938. Range Sum of BST二叉搜索树的范围和

    给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜索树保证具有唯一的值. 示例 1: 输入:root = [10,5,15,3,7,null,18], L = 7 ...

  9. 标准BST二叉搜索树写法

    本人最近被各种数据结构的实验折磨的不要不要的,特别是代码部分,对数据结构有严格的要求,比如写个BST要分成两个类,一个节点类,要给树类,关键是所以操作都要用函数完成,也就是在树类中不能直接操作节点,需 ...

随机推荐

  1. 免费 Bootstrap 管理后台模块下载

    在这文章中我们将分享17+个最好的免费 Bootstrap 管理模板.你可以免费下载这些Twitter bootstrap 框架来开发网站后台. SB Admin 2 SB Admin is a fr ...

  2. SRM 598 DIV1

    A 只有3种情况:200以上的单独装,3个100的装一起,某两个u,v装一起且u+v<=300, 所以做法是从大到小判断每个大小的最大能与它装一起的是谁,最后剩下100的特判. B 第一轮如果未 ...

  3. Unity 3D 动画帧事件

    前几天在项目开发中碰到一个这样的需求,RPG游戏中,特效和动画播放不同步的.假如主角在攻击NPC时,先实例化特效,后播放动画.动画毕竟是有一个时间长度的.等到动画播放攻击挥刀的那一瞬间时,特效可能早就 ...

  4. 如何把java代码转换成smali代码

    1.概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多工具可以把smali代码转化成java代码.但是在学习Smali语法的过程中,有时候需要进行java代码和 ...

  5. C# 创建验证码图片

    using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; us ...

  6. 自定义HttpHandler

    1.创建自定义类型 2.继承IHttpHandler接口,并实现 3.配置Web.Config文件,注册类型 4.访问 public class QuickMsgSatisticsHandler : ...

  7. redis使用Java学习

    一.连接到redis服务 import redis.clients.jedis.Jedis; public class RedisJava { public static void main(Stri ...

  8. (五)CodeMirror - 关于htmlmixed中包含script脚本

    最近发现个问题,场景如下: 当创建的mode类型为htmlmixed,且内容中包含javascript脚本,且是闭包立即执行: 如果内容是使用JQuery函数.html()插入到DOM中后再创建cod ...

  9. SMA2SATA、PCIe2SATA转换模块(也有叫:Sata Test Fixtures)

    SMA2SATA.PCIe2SATA测试夹具(Sata Test Fixtures) 去年制作SMA2SATA.PCIe2SATA适配器的过程早就想写出来,但一直没有时间,今天星期六有个空儿,简单整理 ...

  10. 总结配置搭建tomcat时碰到的一些小问题

    1.环境变量的配置 在配置tomcat的环境变量时始终配置不对,于是首先检查之前java的环境变量是否正确,发现java命令可以用但是javac却找不到,自己又瞎搞一通,终于javac可以用了,但ja ...