二叉搜索树ADT_BSTree

原创 2015年11月18日 17:47:48

二叉搜索树或是一颗空二叉树, 或是具有以下性质的二叉树:

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

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

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


性质: 若以中序遍历一颗二叉搜索树, 将得到一个以关键字值递增排列的有序序列.


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

大于该结点的值, 则以同样的方法搜索右子树, 而不必搜索左子树. 若x等于该结点的值, 则搜索成功终止.

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

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

重复元素. 此时构造一个新结点p存放新元素x, 连至结点q, 成为q的孩子, 则新结点p成为新二叉树的根.

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)(二叉搜索树+层次遍历+中序遍历)

题目描述: A Binary Search Tree (BST) is recursively defined as a binary tree which has the following ...
  • qq_34594236
  • qq_34594236
  • 2017年03月30日 23:13
  • 390

最优二叉搜索树动态规划

问题描述: 最优二叉搜索树问题是对于有序集S及其存取概率或权值(q0,p1,q1,p2,q2,p3,q3),在所有表示有序集S的二叉搜索树中找出一颗具有最小平均路长的二叉搜索树。 解决方法: 使...
  • jiyang_1
  • jiyang_1
  • 2015年11月21日 18:42
  • 1302

二叉搜索树的简单实现(Binary Search Tree)

一、二叉搜索树的概念 二叉搜索树,又称二叉排序树,二叉查找树,他能够高效的完成数据的插入,查询,删除操作,是一种高效的数据结构。 如下图就是一个构建好的二叉搜索树。 特点:    ...
  • chaiwenjun000
  • chaiwenjun000
  • 2015年09月18日 19:49
  • 1029

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

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

C++实现二叉搜索树(二叉排序树)模板类

参考了Weiss的数据结构与算法分析C++描述第三版完成二叉搜索树
  • cjbct
  • cjbct
  • 2016年12月09日 21:51
  • 1060

二叉搜索树 ( 二叉查找树)( 二叉排序树)的定义和遍历

二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;  若它的右子树不空,则右子树上...
  • baoendemao
  • 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
  • DERRANTCM
  • 2015年08月06日 07:47
  • 1950

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

二叉搜索树的定义 二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树: 1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2. 若任意节点的...
  • yanxiaolx
  • yanxiaolx
  • 2016年07月21日 21:59
  • 5190

搜索二叉树的初始化

搜索二叉树的初始化
  • superzbo
  • superzbo
  • 2010年07月19日 16:28
  • 1595

中序遍历-----二叉查找树的遍历(迭代版,不使用栈或者队列)

二叉查找树(Binary Search Tree)的遍历的方法有很多,通常使用的是递归的遍历,其便于理解,但是使用递归的话会造成程序运行的空间浪费,效率并不高。为此可以使用一个栈来模拟递归的过程,实现...
  • shaya118
  • shaya118
  • 2014年11月25日 11:09
  • 928
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉搜索树ADT_BSTree
举报原因:
原因补充:

(最多只允许输入30个字)