# 二叉搜索树ADT_BSTree

1.若左子树不为空, 则左子树上所有结点的关键字值均小于根结点的关键字值.

2.若右子树不为空, 则右子树上所有结点的关键字值均大于根结点的关键字值.

3.左右子树也分别是二叉搜索树.

1.搜索实现: 若二叉树为空, 则搜索失败. 否则, 将x与根结点比较. 若x小于该结点的值, 则以同样的方法搜索左子树, 不必搜索右子树. 若x

search()为递归搜索, search1()为迭代搜索.

2.插入实现: 插入一个新元素时, 需要先搜索新元素的插入位置. 如果树种有重复元素, 返回Duplicate. 搜索达到空子树, 则表明树中不包

3.删除实现: 删除一个元素时, 先搜索被删除结点p, 并记录p的双亲结点q. 若不存在被删除的元素, 返回NotPresent.

(1)若p有两颗非空子树, 则搜索结点p的中序遍历次序下的直接后继结点, 设为s. 将s的值复制到p中.

(2)若p只有一颗非空子树或p是叶子, 以结点p的唯一孩子c或空子树c = NULL取代p.

(3)若p为根结点, 删除后结点c成为新的根. 否则若p是其双亲确定左孩子, 则结点c也应成为q的左孩子, 最后释放结点p所占用的空间.

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
enum ResultCode{ Underflow, Overflow, Success, Duplicate, NotPresent }; // 赋值为0, 1, 2, 3, 4, 5

template <class T>
class DynamicSet
{
public:
virtual ~DynamicSet() {}
virtual ResultCode Search(T &x) const = 0;
virtual ResultCode Insert(T &x) = 0;
virtual ResultCode Remove(T &x) = 0;
/* data */
};

template <class T>
struct BTNode
{
BTNode() { lChild = rChild = NULL; }
BTNode(const T &x) {
element = x;
lChild = rChild = NULL;
}
BTNode(const T &x, BTNode<T> *l, BTNode<T> *r) {
element = x;
lChild = l;
rChild = r;
}
T element;
BTNode<T> *lChild, *rChild;
/* data */
};

template <class T>
class BSTree : public DynamicSet<T>
{
public:
explicit BSTree() { root = NULL; } // 只可显示转换
virtual ~BSTree() { Clear(root); }
ResultCode Search(T &x) const;
ResultCode Search1(T &x) const;
ResultCode Insert(T &x);
ResultCode Remove(T &x);
protected:
BTNode<T> *root;
private:
void Clear(BTNode<T> *t);
ResultCode Search(BTNode<T> *p, T &x) const;
/* data */
};

template <class T>
void BSTree<T>::Clear(BTNode<T> *t)
{
if(t) {
Clear(t -> lChild);
Clear(t -> rChild);
cout << "delete" << t -> element << "..." << endl;
delete t;
}
}

template< class T>
ResultCode BSTree<T>::Search(T &x) const
{
return Search(root, x);
}
template <class T>
ResultCode BSTree<T>::Search(BTNode<T> *p, T &x) const
{
if(!p) return NotPresent;
if(x < p -> element) return Search(p -> lChild, x);
if(x > p -> element) return Search(p -> rChild, x);
x = p -> element;
return Success;
}

template <class T>
ResultCode BSTree<T>::Search1(T &x) const
{
BTNode<T> *p = root;
while(p) {
if(x < p -> element) p = p -> lChild;
else if(x > p -> element) p = p -> rChild;
else {
x = p -> element;
return Success;
}
}
return NotPresent;
}

template <class T>
ResultCode BSTree<T>::Insert(T &x)
{
BTNode<T> *p = root, *q = NULL;
while(p) {
q = p;
if(x < p -> element) p = p -> lChild;
else if(x > p -> element) p = p -> rChild;
else {
x = p -> element;
return Duplicate;
}
}
p = new BTNode<T>(x);
if(!root) root = p;
else if(x < q -> element) q -> lChild = p;
else q -> rChild = p;
return Success;
}

template <class T>
ResultCode BSTree<T>::Remove(T &x)
{
BTNode<T> *c, *s, *r, *p = root, *q = NULL;
while(p && p -> element != x) {
q = p;
if(x < p -> element) p = p -> lChild;
else p = p -> rChild;
}
if(!p) return NotPresent;
x = p -> element;
if(p -> lChild && p -> rChild) {
s = p -> rChild;
r = p;
while(s -> lChild) {
r = s;
s = s -> lChild;
}
p -> element = s -> element;
p = s;
q = r;
}
if(p -> lChild) c = p -> lChild;
else c = p -> rChild;
if(p == root) root = c;
else if(p == q -> lChild) q -> lChild = c;
else q -> rChild = c;
delete p;
return Success;
}
int main(int argc, char const *argv[])
{
BSTree<int> bst;
int x = 28; bst.Insert(x);
x = 21; bst.Insert(x);
x = 25; bst.Insert(x);
x = 36; bst.Insert(x);
x = 33; bst.Insert(x);
x = 43; bst.Insert(x);
return 0;
}

## PAT - 甲级 - 1099. Build A Binary Search Tree (30)（二叉搜索树+层次遍历+中序遍历）

• qq_34594236
• 2017年03月30日 23:13
• 390

## 最优二叉搜索树动态规划

• jiyang_1
• 2015年11月21日 18:42
• 1302

## 二叉搜索树的简单实现（Binary Search Tree）

• chaiwenjun000
• 2015年09月18日 19:49
• 1029

## 二叉搜索树；二叉查找树；二叉排序树；binary search tree

binary search tree，中文翻译为二叉搜索树、二叉查找树或者二叉排序树。简称为BST 一：二叉搜索树的定义 他的定义与树的定义是类似的，也是一个递归的定义： 1、要么是一棵空树 ...
• jiqiren007
• 2011年06月09日 19:09
• 14047

## C++实现二叉搜索树（二叉排序树）模板类

• cjbct
• 2016年12月09日 21:51
• 1060

## 二叉搜索树 （ 二叉查找树）（ 二叉排序树）的定义和遍历

• baoendemao
• 2014年09月02日 16:03
• 3331

## 【LeetCode-面试算法经典-Java实现】【098-Validate Binary Search Tree（验证二叉搜索树）】

【098-Validate Binary Search Tree（验证二叉搜索树）】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题　　Given a binary tree,...
• DERRANTCM
• 2015年08月06日 07:47
• 1950

## 二叉搜索树的定义、查找、插入和删除

• yanxiaolx
• 2016年07月21日 21:59
• 5190

## 搜索二叉树的初始化

• superzbo
• 2010年07月19日 16:28
• 1595

## 中序遍历-----二叉查找树的遍历（迭代版，不使用栈或者队列）

• shaya118
• 2014年11月25日 11:09
• 928

举报原因： 您举报文章：二叉搜索树ADT_BSTree 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)