二叉查找树实现类——二叉链表

原创 2012年03月26日 21:44:09

今晚头还是晕晕的,就随便写个数据结构来提神。

就选了二叉查找树吧,老规矩,直接参考了Wiki上面的内容。

二叉查找树的特性:

二叉查找树Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树

  1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 它的左、右子树也分别为二叉排序树。

二叉查找树的讨论:

二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,期望O(logn),最坏O(n)(数列有序,树退化成线性表).

虽然二叉排序树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉排序树可以使树高为O(logn),如SBT,AVL,红黑树等.故不失为一种好的动态排序方法.


代码如下:

#include <iostream>

using namespace std;

template <class NodeType>
class BSTreeNode
{
public:
	NodeType value;
	BSTreeNode* lChild, rChild;

	BSTreeNode();
};

template <class NodeType>
BSTreeNode<NodeType>::BSTreeNode()
{
	lChild = NULL;
	rChild = NULL;
}

template <class NodeType>
class BinarySearchTree
{
public:
	BinarySearchTree();
	BinarySearchTree(BSTreeNode<NodeType> *node);
	~BinarySearchTree();

	void CreatBinaryTree(BSTreeNode<NodeType> *node);
	void DestroyTree(BSTreeNode<NodeType> *node);
	void InsertValue(NodeType value);							//NodeType必须重载了==及>操作符
	void DeleteNode(BSTreeNode<NodeType> *node);				//NodeType必须重载了=操作符
	BSTreeNode<NodeType>* FindValue(NodeType value);			//NodeType必须重载了=,==及>操作符

private:
	BSTreeNode<NodeType> *root;
	void CopyTree(BSTreeNode<NodeType> *position, BSTreeNode<NodeType> *node);
	void InsertValue(BSTreeNode<NodeType> *node, NodeType value);
	BSTreeNode<NodeType>* FindValueFrom(BSTreeNode<NodeType> *node, NodeType value);
};

template <class NodeType>
BinarySearchTree<NodeType>::BinarySearchTree()
{
	root = NULL;
}

template <class NodeType>
BinarySearchTree<NodeType>::BinarySearchTree(BSTreeNode<NodeType> *node)
{
	CreatBinaryTree(node);
}

template <class NodeType>
BinarySearchTree<NodeType>::~BinarySearchTree()
{
	DestroyTree(root);
}

template <class NodeType>
void BinarySearchTree<NodeType>::CreatBinaryTree(BSTreeNode<NodeType> *node)
{
	CopyTree(root, node);
}

template <class NodeType>
void BinarySearchTree<NodeType>::CopyTree(BSTreeNode<NodeType> *position, BSTreeNode<NodeType> *node)
{
	if (NULL == node)
	{
		position = NULL;
		return ;
	}

	position = new BSTreeNode<NodeType>;
	position->value = node->value;

	CopyTree(position->lChild, node->lChild);
	CopyTree(position->rChild, node->rChild);
}

template <class NodeType>
void BinarySearchTree<NodeType>::DestroyTree(BSTreeNode<NodeType> *node)
{
	if (NULL == node)
	{
		return ;
	}

	DestroyTree(node->lChild);
	DestroyTree(node->rChild);

	delete node;
}

template <class NodeType>
void BinarySearchTree<NodeType>::InsertValue(NodeType value)
{
	InsertValue(root, value);
}

template <class NodeType>
void BinarySearchTree<NodeType>::InsertValue(BSTreeNode<NodeType> *node, NodeType value)
{
	if (NULL == node)
	{
		node = new BSTreeNode<NodeType>;
		node->value = value;
		return ;
	}

	if (node->value == value)
	{
		return ;
	}
	else if ( node->value > value)
	{
		InsertValue(node->lChild, value);
	}
	else
	{
		InsertValue(node->rChild, value);
	}
}

template <class NodeType>
BSTreeNode<NodeType>* BinarySearchTree<NodeType>::FindValueFrom(BSTreeNode<NodeType> *node, NodeType value)
{
	if (NULL == node)
	{
		return NULL;
	}
	
	if (node->value == value)
	{
		return node;
	}
	else if (node->value > value)
	{
		return FindValueFrom(node->lChild, value);
	}
	else
	{
		return FindValueFrom(node->rChild, value);
	}
}

template <class NodeType>
BSTreeNode<NodeType>* BinarySearchTree<NodeType>::FindValue(NodeType value)
{
	return FindValueFrom(root,value);
}

template <class NodeType>
void BinarySearchTree<NodeType>::DeleteNode(BSTreeNode<NodeType> *node)
{
	if (NULL == node)
	{
		return ;
	}

	BSTreeNode<NodeType> *currentNode = FindValue(node->value);
	if (NULL == currentNode)
	{
		return ;
	}

	BSTreeNode<NodeType> *lastNode;
	while (currentNode != NULL)
	{
		lastNode = currentNode;
		currentNode->value = currentNode->rChild.value;
		currentNode = currentNode->rChild;
	}

	delete currentNode;
	lastNode->rChild = NULL;
}


数据结构(12)--二叉树的静态链表存储和遍历的实现

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社 1.二叉树的定义     二叉树(Binary Tree)是结点的有限集合,这个集合或者是空,或者是由一个根结点和两棵互不相交的称为左子树...
  • u010366748
  • u010366748
  • 2016年02月29日 14:46
  • 2613

二叉查找树 C++实现

二叉查找树C++实现
  • mimi9919
  • mimi9919
  • 2016年04月10日 20:27
  • 2232

用二叉链表实现二叉查找树(二)

/* 二叉查找树的链表实现: 以及三种遍历方式,删除节点; 查找节点; author:天下无双 Date:2014-5-28 Version:3.0 */ #include #inclu...
  • guang_jing
  • guang_jing
  • 2014年05月28日 21:14
  • 902

AVL树实现类——二叉链表实现

(一个人感冒咳嗽不悲剧,悲剧的是全家都感冒咳嗽,没人做事……忽冷忽热的天气得注意保暖) 首先吧,关于AVL树的知识,还是老规矩,Wiki下。 “在计算机科学中,AVL树是最先发明的自平衡二叉查找树...
  • BetaBin
  • BetaBin
  • 2012年03月30日 10:44
  • 1173

二叉树的二叉链表创建

⑴  按满二叉树方式建立 (补充)     在此补充按满二叉树的方式对结点进行编号建立链式二叉树。对每个结点,输入i、ch。i : 结点编号,按从小到大的顺序输入;ch : 结点内容,假设是字符。在...
  • peace_power
  • peace_power
  • 2011年12月14日 13:21
  • 897

二叉链表的建立

 二叉链表的建立 为了后面遍历二叉树方便,先介绍建立二叉链表的算法(假设elemtype 为char型)。 假设二叉链表的数据类型描述如刚才所述,为建立二叉链表,用一个一维表数组来模拟队列,存放输入的...
  • ll8240456
  • ll8240456
  • 2008年03月22日 20:33
  • 938

建立二叉树的二叉链表

描述 已知二叉树的中序序列和前序序列存放在两个一维数组中,尝试建立二叉树的二叉链表。检查是否建立成功的方法是输出该二叉树的后序序列。   输入 分别输入二叉树的中序序列和前序序列   输出...
  • axiqia
  • axiqia
  • 2016年03月25日 22:26
  • 3863

由先序遍历和中序遍历构造二叉树的二叉链表代码

转载自:http://blog.csdn.net/sunmeng_007/article/details/8095224 #include //定义节点 typedef struct btnode {...
  • ilikeprograming
  • ilikeprograming
  • 2013年12月28日 11:31
  • 1604

二叉树之二叉链表的类模板实现

该类模板实现了一个二叉树的模板类,采用二叉链表实现。 定义二叉树节点类,采用二叉链表实现。 [cpp] view plaincopyprint? ...
  • han____shuai
  • han____shuai
  • 2015年08月13日 00:45
  • 1239

二叉树的链表表示法实现

本程序实际上是构建了一颗二叉排序树,程序最后输出构建数的中序遍历。 代码实现: #include #include typedef int DataType; typedef stru...
  • w397090770
  • w397090770
  • 2012年05月02日 16:41
  • 4960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉查找树实现类——二叉链表
举报原因:
原因补充:

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