# 二叉搜索树实现与测试

/******************************************
* 文件名:BSTree.cpp
* 功能:1,定义二叉查找树结点
2,定义二叉查找树
3,测试二叉查找树
*****************************************
*/

#include
<iostream>
using namespace std;

template
<typename T>
class BSTnode
{
public:
BSTnode():pare(
0),left(0),right(0)

{ }
BSTnode(
const T &v, BSTnode<T> *= 0, BSTnode<T> *lef = 0, BSTnode<T> *rig = 0):value(v),pare(p),left(lef),right(rig)

{ }

public:
T value;
BSTnode
<T> *pare, *left, *right;
}
;

// 以上是二叉查找树结点的定义
// 以下是二叉查找树的定义

template
<typename T>
class BSTree
{
public:
BSTnode
<T> *root;

public:
BSTree():root(
0)

{}
BSTree(
const BSTnode<T> &r):root(&r)

{}
BSTree(
const T &v)

{
root
= new BSTnode<T>(v);
}

void Insert_BST(const T &v)

{

if( root == 0 )
root
= new BSTnode<T>(v);

else

{
BSTnode
<T> *curr = root;
BSTnode
<T> *= 0;

while(curr != 0)

{
p
= curr;
curr
= (v > curr->value) ? curr->right : curr->left;
}

curr
= new BSTnode<T>(v);
curr
->pare = p;

if( curr->value > p->value )
p
->right = curr;

else
p
->left = curr;
}
// else
}
// Insert_BST

BSTnode
<T> *search_BST(const T &v)

{
BSTnode
<T> *curr = root;

while( (curr != 0&& (v != curr->value) )

{
curr
= (v > curr->value) ? curr->right : curr->left;
}

return curr;
}
// search_BST

T mini_BST(BSTnode
<T> *r) const

{
BSTnode
<T> *curr = r;

while( curr->left != 0 )
curr
= curr->left;

return curr->value;
}

T max_BST(BSTnode
<T> *r) const

{
BSTnode
<T> *curr = r;

while(curr->right != 0)
curr
= curr->right;

return curr->value;
}

T next_BST(
const T &v)

{
BSTnode
<T> *curr;
curr
= search_BST(v);

if(curr->right != 0)

return mini_BST(curr->right);

BSTnode
<T> *= curr->pare;

while((p != 0&& (curr == p->right))

{
curr
= p;
p
= p->pare;
}

return p->value;
}

T prev_BST(
const T &v)

{
BSTnode
<T> *curr;
curr
= search_BST(v);

if(curr->left != 0)

return max_BST(curr->left);

BSTnode
<T> *= curr->pare;

while((p != 0&& (curr == p->left))

{
curr
= p;
p
= curr->pare;
}

return p->value;
}

BSTnode
<T> *del_BST(BSTnode<T> *r, const T &v)

{
BSTnode
<T> *curr, *y, *x;
curr
= 0;
y
= 0;
x
= 0;

curr
= search_BST(v);

if( curr == 0 )

return 0;

if((curr->left == 0|| (curr->right == 0))
y
= curr;

else
y
= search_BST(next_BST(v));

if( y->left != 0 )
x
= y->left;

else
x
= y->right;

if(x != 0)
x
->pare = y->pare;

if(y->pare == 0)
r
= x;

else if( y == y->pare->left )
y
->pare->left = x;

else
y
->pare->right = x;

if( y != curr )
curr
->value = y->value;

return y;
}

// 中序遍历BSTree 输出每个结点值
void InOrder_BST(BSTnode<T> *r)

{

if(r != 0)

{
InOrder_BST(r
->left);
cout
<< r->value << ' ';
InOrder_BST(r
->right);
}

}

}
;

/***************************************************
14
/
3        17
/           /
2     5      15   18
/
4   7

**************************************************
*/

int main()
{
BSTree
<int> a(14);

a.Insert_BST(
3);
a.Insert_BST(
2);
a.Insert_BST(
5);
a.Insert_BST(
4);
a.Insert_BST(
7);
a.Insert_BST(
17);
a.Insert_BST(
15);
a.Insert_BST(
18);

a.InOrder_BST(a.root);
cout
<< endl;

// 2 3 4 5 7 14 15 17 18

cout
<< a.prev_BST(5<< " <- 5 -> " << a.next_BST(5<< endl;

// 4 <- 5 -> 7

cout
<< a.search_BST(5)->value << endl;

// 5

cout
<< a.del_BST(a.root, 3)->value << endl;

// 7

a.InOrder_BST(a.root);

// 2 3 4 7 14 15 17 18

return 0;
}

• 本文已收录于以下专栏：

## 二叉搜索树的数组实现

tree.h:/*** 二叉搜索树模块的接口*/// 树的元素的类型. #define TREE_TYPE  int   // --------------------------外部接口------...
• dingyuanpu
• 2010年08月13日 13:54
• 2157

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

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

## 剑指offer 面试题27—二叉搜索树与双向链表

• wtyvhreal
• 2015年05月11日 22:19
• 872

## 二叉搜索树BST的C++实现

BST 包含的功能：插入，删除，查找，查找某一结点的后续和前驱，中序遍历和前序遍历 这里，用于实验的二叉树: //二叉搜索树BST #include #include using names...
• liuchenjane
• 2016年11月05日 17:58
• 2216

## 二叉查找树的C++实现

• sysu_arui
• 2012年08月21日 18:11
• 2224

## 二叉搜索树与双向链表(java版)

• hll174
• 2016年03月27日 22:18
• 977

## 二叉搜索树与双向链表Java

• u013238950
• 2016年03月08日 18:51
• 852

## 二叉查找树的简单模板实现

• RO_wsy
• 2012年06月24日 15:39
• 998

## 【剑指Offer】二叉搜索树与双向链表

• zgljl2012
• 2015年09月19日 02:11
• 1850

## 二叉查找树 C++实现

• mimi9919
• 2016年04月10日 20:27
• 2231

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