/******************************************
数据结构:
BST(Binary Search Tree),二叉查找树;性质:
若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
该结点的左、右子树也分别为二叉查找树;遍历:
对于一个已知的二叉查找树,从小到大输出其节点的值;
只需对其进行二叉树的中序遍历即可;
即递归地先输出其左子树,再输出其本身,然后输出其右子树;
遍历的时间复杂度为O(n);查找:
对于一个已知的二叉查找树x;
在其中查找特定的值k,函数Search返回指向值为k的节点指针;
若找不到则返回0,算法时间复杂度为O(h),h为树的高度;
理想情况下时间复杂度为lgn;最大值和最小值:
要查找二叉查找树中具有最小值的元素;
只要从根节点开始,沿着左子树找到最左边的节点就可以了;
反之沿着右子树查找则可以求最大值;插入:
从根节点开始插入;
如果要插入的值小于等于当前节点的值,在当前节点的左子树中插入;
如果要插入的值大于当前节点的值,在当前节点的右子树中插入;
如果当前节点为空节点,在此建立新的节点,该节点的值为要插入的值,左右子树为空,插入成功;删除:
如果该没有子女,直接删除;
如果该结点只有一个子女,则删除它,将其子女的父亲改为它的父亲;
如果该结点有两个子女,先用其后继替换该节点,其后继的数据一并加在其后;
*******************************************/
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<climits>
#include<algorithm>
using namespace std;const int N = 100000;
int key[N], l[N], r[N], p[N];
int u, node;int Search(int x, int k)//查询
{if(x == 0 || k == key[x])return x;if(k < key[x])return Search(l[x], k);elsereturn Search(r[x], k);
}int Iterative_Search(int x, int k)//非递归版本的查询
{while(x != 0 && k != key[x])if(k < key[x])x = l[x];elsex = r[x];return x;
}int Minimum(int x)
{while(l[x] != 0)x = l[x];return x;
}int Maximum(int x)
{while(r[x] != 0)x = r[x];return x;
}int Successor(int x)
{if(r[x] != 0)return Minimum(r[x]);int y = p[x];while(y != 0 && x == r[y]){x = y;y = p[y];}return y;
}int Predecessor(int x)
{if(l[x] != 0)return Maximum(l[x]);int y = p[x];while(y != 0 && x == l[y]){x = y;y = p[y];}return y;
}void Insert(int &T, int v)//插入结点
{if(T == 0)key[T = ++node] = v;else if(v <= key[T]){p[l[T]] = T;Insert(l[T], v);}else{p[r[T]] = T;Insert(r[T], v);}
}void Iterative_Insert(int T, int v)//非递归版本插入结点
{int y = 0;int x = T;int z = ++node;key[z] = v;while(x != 0){y = x;if(key[z] < key[x])x = l[x];elsex = r[x];}p[z] = y;if(y == 0)key[T] = z;else if(key[z] < key[y])l[y] = z;elser[y] = z;
}void Transplant(int T, int u, int v)//移植过程;
//把一棵子树u归并到另一棵子树v中,u的父亲变为v的父亲,u的父亲就有了v作为其孩子。
{if(p[u] == 0)T = v;else if(u == l[p[u]])l[p[u]] = v;elser[p[u]] = v;if(v != 0)p[v] = p[u];
}void Delete(int T, int z)//删除结点
{if(l[z] == 0)Transplant(T, z, r[z]);else if(r[z] == 0)Transplant(T, z, l[z]);else{int y = Minimum(r[z]);if(p[y] != z){Transplant(T, y, r[y]);r[y] = r[z];p[r[y]] = y;}Transplant(T, z, y);l[y] = l[z];p[l[y]] = y;}
}int main()
{int n;scanf("%d",&n);for(int i=0; i<n; i++){int k;scanf("%d",&k);Insert(u, k);}Delete(u, Search(u, 1));printf("%d\n",Search(u,2));printf("%d\n",Maximum(u));return 0;
}

BST(Binary Search Tree 二叉查找树模版)相关推荐

  1. 数据结构-BST(Binary Search Tree)

    /****************************************** 数据结构: BST(Binary Search Tree),二叉查找树;性质: 若结点的左子树不空,则左子树上所 ...

  2. 二叉查找树(BST Binary Search Tree)

    二叉查找树的特点是什么? 左子树所有的节点都小于父节点,右子树所有的节点都大于父节点.投影到平面以后,就是一个有序的线性表. 二叉查找树既能够实现快速查找,又能够实现快速插入. 但是二叉查找树有一个问 ...

  3. BST(binary search tree)类型题目需要用到的头文件binary_tree.h

    下面是二叉搜索树需要用到的头文件binary_tree.h #include <stdio.h>struct BinaryTreeNode{int value;BinaryTreeNode ...

  4. 1043 Is It a Binary Search Tree(二叉查找树BST)

    1043 Is It a Binary Search Tree 0.题目 A Binary Search Tree (BST) is recursively defined as a binary t ...

  5. 数据结构与算法(C++)– 二叉查找树(Binary Search Tree )

    数据结构与算法(C++)– 二叉查找树(Binary Search Tree ) 1.二叉查找树(BST) 定义: 假设二叉树的节点都是不同的数,对于树点的任一节点,它的左子树都小于它,它的右子树都大 ...

  6. 学习数据结构 二叉查找树(binary search tree)

    2019独角兽企业重金招聘Python工程师标准>>> 为学习 LLVM 的 ImmutableSet,其底层的实现选择为 AVL 树(平衡二叉搜索树),我不很熟悉该树,虽然大致知道 ...

  7. 二叉查找树(binary search tree)详解

    二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于 ...

  8. PAT甲级1064 Complete Binary Search Tree (30分):[C++题解]完全二叉搜索树BST

    文章目录 题目分析 题目链接 题目分析 思路: 第一步,构造含有n个结点的完全二叉树:第二步,将n个数值填入,使其满足二叉搜索树的性质. 对于第一步: 完全二叉树用一维数组可以存下,不过从根结点的下标 ...

  9. PAT甲级1043 Is It a Binary Search Tree :[C++题解]判断二叉搜索树BST、给定前序序列和中序序列

    文章目录 题目分析 题目链接 题目分析 二叉搜索树(BST):左子树小于根结点,右子树大于等于根结点. 二叉搜索树的中序遍历一定是有序序列.所谓中序遍历:先访问左子树,再访问根结点,最后访问右子树. ...

最新文章

  1. 数据结构特性解析 (四)LinkedList
  2. SAP获利能力报表常用Tcode的区别
  3. box-sizing详解
  4. 微信小程序退出页面时清除定时器
  5. 使用JavaScript正则表达式解析markdown里的图片标签
  6. 牛客网选择题之linux
  7. 知乎搜索框背后的Query理解和语义召回技术
  8. cast函数_关闭RTTI后dynamic_cast和typeid报异常
  9. python 会计师事务所_Selenium爬取会计师事务所新闻信息——以中准会计师事务所为例...
  10. 使用Nexus搭建Maven仓库私服的权限配置心得
  11. matlab 扩大虚拟内存,matlab 扩大虚拟内存
  12. Python读写excel练习_去除excel中乱码行,并添加列
  13. Python通过Socket实现QQ聊天功能
  14. 一招解决GitHub致命的下载速度(GitHub下载速度慢怎么办)
  15. 论文解读:Combining Distant and Direct Supervision for Neural Relation Extraction
  16. 【uniApp 接入萤石云】
  17. 下载夜神模拟器-安装autojs-连接vscode
  18. 华为云文档数据库服务更安全
  19. JFinal配置说明
  20. i5集显和独显的区别_核显和独显、集成显卡有什么区别,那个好!

热门文章

  1. RocketMQ消息支持的模式-OrderProducer(顺序)
  2. HelloWorld程序的编译运行
  3. SasSHRM中基于shiro的认证授权:系统微服务配置shiro
  4. 数据库-优化-MYSQL数据库设计规范
  5. 格式化输出浮点型变量
  6. SpringBoot_数据访问-整合MyBatis(二)-注解版MyBatis
  7. 图的最短路径(一级)
  8. 使用Docker运行java项目需要注意的glibc依赖库问题
  9. windows病毒和linux吗,与Windows相比,Linux很少感染病毒。()
  10. LMV358, LMV321, LMV324, LMV324S-注意事项