BST是一类用途极广的数据结构。它有如下性质:设x是二叉搜索树内的一个结点。如果y是x左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。

BST容易出现不平衡的情况,所以实际运用的时候还是以平衡的二叉搜索树为主,例如RB树,AVL树,treap树甚至skiplist等。

BST实现较为简单,我们直接来看看代码吧。

代码如下:(仅供参考)

 #include <iostream>
using namespace std; struct Node {
int key;
Node * left;
Node * right;
Node * parent;
Node() : key(), left(nullptr), right(nullptr), parent(nullptr) {}
}; class BST {
Node * root;
private :
Node * minimum(Node * p);
Node * maximum(Node * p);
//用新结点代替旧结点,只修改结点与其父节点的指向,允许新结点为空
void transplant(Node * old_t, Node * new_t);
public :
BST() : root(nullptr) {}
Node * search(const int k) {return search(root, k);}
Node * search(Node * p, const int k);
const Node * minimum() {return minimum(root);}
const Node * maximum() {return maximum(root);}
const Node * successor(Node * p);
const Node * predecessor(Node * p);
void insert(const int k);
void remove(const int k) {remove(search(k));}
void remove(Node * p);
void inorderWalk() {inorderWalk(root);}
void inorderWalk(Node * p);
}; Node * BST::search(Node * p, const int k) {
if (p == nullptr || k == p->key)
return p;
if (k < p->key)
return search(p->left, k);
else
return search(p->right, k);
} Node * BST::minimum(Node * p) {
if (p == nullptr)
return p;
while (p->left)
p = p->left;
return p;
} Node * BST::maximum(Node * p) {
if (p == nullptr)
return p;
while (p->right)
p = p->right;
return p;
} const Node * BST::successor(Node * p) {
if (p->right)
return minimum(p->right);
Node * y = p->parent;
while (y != nullptr && y->right == p) {
p = y;
y = y->parent;
}
return y;
} const Node * BST::predecessor(Node * p) {
if (p->left)
return maximum(p->left);
Node * y = p->parent;
while (y != nullptr && y->left == p) {
p = y;
y = y->parent;
}
return y;
} void BST::insert(const int k) {
Node * p = new Node;
p->key = k; Node *x = root, *y = nullptr;
while (x != nullptr) {
y = x;
if (x->key < k)
x = x->right;
else
x = x->left;
}
p->parent = y;
if (y == nullptr)
root = p;
else if (y->key < k)
y->right = p;
else
y->left = p;
} void BST::transplant(Node * old_t, Node * new_t) {
if (old_t->parent == nullptr)
root = new_t;
else if (old_t == old_t->parent->left)
old_t->parent->left = new_t;
else
old_t->parent->right = new_t;
if (new_t != nullptr)
new_t->parent = old_t->parent;
} void BST::remove(Node * p) {
if (p->left == nullptr)
transplant(p, p->right);
else if (p->right == nullptr)
transplant(p, p->left);
else {
Node * t = minimum(p->right);
if (t->parent != p) {
transplant(t, t->right);
t->right = p->right;
t->right->parent = t;
}
transplant(p, t);
t->left = p->left;
t->left->parent = t;
}
delete p;
} void BST::inorderWalk(Node * p) {
if (p) {
inorderWalk(p->left);
cout << p->key << ends;
inorderWalk(p->right);
}
}

BinarySearchTree(二叉搜索树)原理及C++代码实现的更多相关文章

  1. java二叉搜索树原理与实现

    计算机里面的数据结构 树 在计算机存储领域应用作用非常大,我之前也多次强调多磁盘的存取速度是目前计算机飞速发展的一大障碍,计算机革命性的的下一次飞跃就是看硬盘有没有质的飞跃,为什么这么说?因为磁盘是永 ...

  2. 编程算法 - 二叉搜索树(binary search tree) 代码(C)

    二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...

  3. AVL平衡二叉搜索树原理及各项操作编程实现

    C语言版 #include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Po ...

  4. BinarySearchTree二叉搜索树的实现

    /* 二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; ...

  5. C++ 二叉搜索树原理及其实现

    首先是概念:二叉搜索树又称二叉排序树,它具有以下的性质: 若是左子树不为空,则左子树上所有节点的值小于根节点的值 若是右子树不为空,则右子树上所有结点的值大于根节点的值 二叉搜索树的左右子树也是二叉搜 ...

  6. 【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C语言)

    #include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Positio ...

  7. 二叉搜索树详解(Java实现)

    1.二叉搜索树定义 二叉搜索树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根 ...

  8. JS递归及二叉搜索树的移除节点

    1递归含义:在某时某刻某个条件下调用包含自己的函数 2:注意点:⑴递归过程中一定要加限制条件,要不然会陷入死循环: 死循环eg: function f(someP){ f(somP); } f(4); ...

  9. 编程算法 - 二叉搜索树 与 双向链表 代码(C++)

    二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求 ...

随机推荐

  1. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring体系结构详解

    Spring 框架采用分层架构,根据不同的功能被划分成了多个模块,这些模块大体可分为 Data Access/Integration.Web.AOP.Aspects.Messaging.Instrum ...

  2. Android进阶——Android消息机制之Looper、Handler、MessageQueen

    Android消息机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 在安卓开发中,常常会遇到获取数据后更新UI ...

  3. swtich多个case使用同一操作

    switch (expression) { case 'status01': case 'status02': case 'status03': alert('resultOne'); break; ...

  4. Golang---BASE64编码原理

    BASE64编码概念 Base64 是一种基于64个可打印字符来表示二进制数据的表示方法.在 Base64中可打印字符包括字母 A-Z, a-z, 数字 0-9,这样共有 62 个字符,另外两个可打印 ...

  5. Java底层魔术类Unsafe用法简述

    1 引子 Java中没有指针,不能直接对内存地址的变量进行控制,但Java提供了一个特殊的类Unsafe工具类来间接实现.Unsafe主要提供一些用于执行低级别.不安全操作的方法,如直接访问系统内存资 ...

  6. selenium登陆qq邮箱页面

    from selenium import webdriver driver = webdriver.Chrome() driver.get('https://mail.qq.com/cgi-bin/l ...

  7. [ZJCTF 2019]NiZhuanSiWei

    0x00知识点 1:data伪协议写入文件 2:php:// php://filter用于读取源码 php://input用于执行php代码 3反序列化 0x01解题 打开题目,给了我们源码 < ...

  8. [RoarCTF 2019]Easy Calc-协议层攻击之HTTP请求走私

    0X01:什么是HTTP请求走私 HTTP请求走私属于协议层攻击,是服务器漏洞的一种. HTTP请求走私是一种干扰网站处理从一个或多个用户接收的HTTP请求序列的方式的技术.使攻击者可以绕过安全控制, ...

  9. CVPR2019 | 超越Mask R-CNN!华科开源图像实例分割新方法MS R-CNN

    安妮 乾明 发自 凹非寺 本文转载自量子位(QbitAI) 实习生又立功了! 这一次,亮出好成绩的实习生来自地平线,是一名华中科技大学的硕士生. 他作为第一作者完成的研究Mask Scoring R- ...

  10. MYSQL8用户创建及权限操作

    MYSQL8创建.删除用户和授权.消权操作 上网找过资料说要进入mysql数据库在进行这些操作,我试了发现不进数据库和进入mysql数据库效果都一样 网上有的直接创建并赋权,像酱紫的: grant a ...