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. [前端] VUE基础 (8) (vue-cli脚手架)

    一.安装vue-cli脚手架 官方文档:https://cli.vuejs.org/zh/guide/cli-service.html Vue CLI 的包名称由 vue-cli改成了  @vue/c ...

  2. 腾讯大佬告诉你,写Python到底用什么IDE合适

    不管你是 Python 新手还是老鸟,肯定纠结过一个问题: 到底用什么编辑器写 Python 代码好? 为此,我们调查了数十位鹅厂程序猿们爱用的 Python IDE,从他们对每款编辑器的看法中,也许 ...

  3. C语言笔记 15_标准库&locale&math&setjmp&signal&stdarg&stddef

    <locale.h> 简介 locale.h 头文件定义了特定地域的设置,比如日期格式和货币符号.接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两个重要的函数. ...

  4. CocoaPods为多个target添加依赖库/Podfile的配置

    Podfile的相关配置,请看官方文档http://guides.cocoapods.org/syntax/podfile.html 1)多个target公用相同库,还可以添加额外的不同第三方库 编辑 ...

  5. 内存管理之堆heap

    1.什么是堆? 堆(heap)是一种内存管理方式.内存管理对操作系统来说是一件非常复杂的事情,因为首先内存容量很大, 其次就是内存需求在时间和大小块上没有规律(操作系统上运行着几十甚至几百个进程,这些 ...

  6. vscode显示当前文件完整路径信息

    Code->Preferences->Settings 搜索window.title 原本是activeEditorShort,修改 activeEditorShort => act ...

  7. Tensorflow函数——tf.set_random_seed(seed)

    设置图级随机seed. 依赖于随机seed的操作实际上从两个seed中获取:图级和操作级seed. 这将设置图级别的seed. 其与操作级seed的相互作用如下: 1.如果没有设置图形级别和操作see ...

  8. inception对应参数

  9. flask web实战1.27

    1.在pycharm的terminal中输入 生成requirements.txt文件 pip freeze > requirements.txt 安装requirements.txt依赖 pi ...

  10. 使用pycharm遇到问题排查过程

    一.安装Python 下载路径:https://www.python.org/downloads/ 二.配置环境变量 安装Python后,配置环境变量,将安装目录添加到Path中: 使用pycharm ...