二叉搜索树的插入,删除,查找操作

原创 2015年11月21日 19:35:15
<pre name="code" class="cpp">//头文件
//BinaryTreeNode.h
#ifndef BINARYTREENODE_H
#define BINARYTREENODE_H
template<typename T>
class BinaryTreeNode{
public:
	T data;
	BinaryTreeNode<T>* leftChild;
	BinaryTreeNode<T>* rigthChild;
	BinaryTreeNode<T>* parent;
	BinaryTreeNode(){

	}
	BinaryTreeNode(const T& val, BinaryTreeNode<T>* str, BinaryTreeNode<T>* ptr,BinaryTreeNode<T>* far) :data(val), leftChild(str), rigthChild(ptr),parent(far){

	}
};
#endif
//BinarySearchTree.h
#ifndef BINARYSEARCHTREE_H
#define BINARYSEARCHTREE_H
#include"BinaryTreeNode.h"
#include<iostream>
#include<queue>
#include<string>
using namespace std;
template<typename T>
class BinarySearchTree{
private:
	BinaryTreeNode<T>* root;
	BinaryTreeNode<T>* aim;//要删除的目标指针
private:
	void Clear();
	void CreatTree();
	void InsertNode(BinaryTreeNode<T>* &str, const T& val);
	void PrintIonder()const;
	bool FingVal(const T& val);
	void PrintFindVal(const T& val);
	void DeleteNode(const T& val);
public:
	BinarySearchTree();
	~BinarySearchTree();
	void simulate();
};
template<typename T>
BinarySearchTree<T>::BinarySearchTree()
{
	this->root = NULL;
	this->aim = NULL;
}
template<typename T>
BinarySearchTree<T>::~BinarySearchTree()
{
	this->Clear();
}
template<typename T>
void BinarySearchTree<T>::Clear()
{
	if (this->root)
		return;
	queue<BinaryTreeNode<T>*>node;
	node.push(root);
	while (!node.empty())
	{
		root = node.front();
		node.pop();
		if (root->leftChild)
			node.push(root->leftChild);
		if (root->rigthChild)
			node.push(root->rigthChild);
		delete root;
	}
	root = NULL;
}
template<typename T>
void BinarySearchTree<T>::CreatTree()
{
	queue<T>arr;
	cout << "input the data end of # :";
	string str;
	cin >> str;
	int count = str.length();
	for (int i = 0; str[i]!='#'; i++)
	{
		arr.push(str[i]);
	}
	while (!arr.empty())
	{
		this->InsertNode(this->root, arr.front());
		arr.pop();
	}
}
template<typename T>
void BinarySearchTree<T>::InsertNode(BinaryTreeNode<T>* &str, const T& val)
{
	//插入节点,如果根为空,则生成根节点
	if (root == NULL)
	{
		root = new BinaryTreeNode<T>(val, NULL, NULL,NULL);
		return;
	}
	//否则从根节点开始寻找,如果大于该节点值,则寻找右子树,如果小于则找该节点的左子树
	BinaryTreeNode<T>* ptr = str;
	BinaryTreeNode<T>* prev = NULL;
	while (ptr)
	{
		//该循环的作用是找到一个最后与val有关的节点
		prev = ptr;
		if (ptr->data > val)
			ptr = ptr->leftChild;
		else
			ptr = ptr->rigthChild;
	}
	//开始比较找到的节点的值与给的值的关系,确定要生成的节点的位置
	if (prev->data > val)
	{
		prev->leftChild = new BinaryTreeNode<T>(val, NULL, NULL,prev);
	}
	else if (prev->data < val)
	{
		prev->rigthChild = new BinaryTreeNode<T>(val, NULL, NULL, prev);
	}
	else
		return;
}
template<typename T>
void BinarySearchTree<T>::PrintIonder()const
{
	BinaryTreeNode<T>* str = this->root;
	if (str == NULL)
	{
		cout << "the tree is empty" << endl;
		return;
	}
	queue<BinaryTreeNode<T>*>node;
	node.push(str);
	while (!node.empty())
	{
		str = node.front();
		node.pop();
		if (str->leftChild)
			node.push(str->leftChild);
		if (str->rigthChild)
			node.push(str->rigthChild);
		cout << str->data << " ";
	}
}
template<typename T>
void BinarySearchTree<T>::simulate()
{
	this->CreatTree();
	this->PrintIonder();
	T val;
	cout << "输入你要查找的数据:";
	cin >> val;
	this->PrintFindVal(val);
	cout << "输入你要删除的数据:";
	cin >> val;
	this->DeleteNode(val);
	this->PrintIonder();
}
template<typename T>
bool BinarySearchTree<T>::FingVal(const T& val)
{
	this->aim = this->root;
	if (aim == NULL)
	{
		cout << "the tree is empty" << endl;
		return false;
	}
	while (aim)
	{
		if (aim->data > val)
		{
			aim = aim->leftChild;
		}
		else if (aim->data < val)
		{
			aim = aim->rigthChild;
		}
		else
		{		
			return true;
		}
	}
	return false;
}
template<typename T>
void BinarySearchTree<T>::PrintFindVal(const T& val)
{
	this->aim = NULL;
	bool flag = this->FingVal(val);
	if (!flag)
	{
		cout << "no find" << endl;
		return;
	}
	cout << aim->data <<"查找成功"<< endl;
}
template<typename T>
void BinarySearchTree<T>::DeleteNode(const T& val)
{
	if (!this->FingVal(val))
	{
		cout << "没有找到要删除的节点" << endl;
		return;
	}
	if (this->aim->leftChild == NULL&&this->aim->rigthChild == NULL)
	{
		//要删除的节点没有左右孩子
		BinaryTreeNode<T>* str = this->aim->parent;
		if (str->rigthChild == aim)
		{
			str->rigthChild = NULL;
			delete aim;
		}
		else
		{
			str->leftChild = NULL;
			delete aim;
		}
	}
	else if (this->aim->leftChild != NULL&&this->aim->rigthChild == NULL)
	{
		//要删除的节点只有左孩子,没有右孩子
		BinaryTreeNode<T>* str = this->aim->parent;
		BinaryTreeNode<T>* ptr = this->aim->leftChild;
		if (this->aim == str->rigthChild)
		{
			str->rigthChild = ptr;
			delete aim;
		}
		else
		{
			str->leftChild = ptr;
			delete aim;
		}
	}
	else if (this->aim->leftChild == NULL&&this->aim->rigthChild != NULL)
	{
		//要删除的节点只有右孩子,没有左孩子
		BinaryTreeNode<T>* str = this->aim->parent;
		BinaryTreeNode<T>* ptr = this->aim->rigthChild;
		if (this->aim == str->leftChild)
		{
			str->leftChild = ptr;
			delete aim;
		}
		else
		{
			str->rigthChild = ptr;
			delete aim;
		}
	}
	else
	{
		//该情况是删除的节点左右孩子都存在,还情况下是寻找该节点的右子树中的最小值或者是
		//寻找该节点的左子树中的最大的节点
		BinaryTreeNode<T>* str = this->aim->parent;
		//开始寻找该节点左子树中的最大值
		BinaryTreeNode<T>* ptr = this->aim->leftChild;
		while (ptr->rigthChild)
		{
			ptr = ptr->rigthChild;
		}
		this->aim->data = ptr->data;
		BinaryTreeNode<T>* prev = ptr->parent;
		prev->rigthChild = NULL;
		delete ptr;
	}
}
#endif
//主函数
#include"BinarySearchTree.h"
int main(int argc, char argv[])
{
	BinarySearchTree<char>tree;
	tree.simulate();
	return 0;
}




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

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

【算法导论】二叉搜索树的插入和删除

阐述二叉搜索树的插入和删除节点操作。
  • cyp331203
  • cyp331203
  • 2015年01月11日 11:47
  • 1658

二叉排序树(查询、插入、删除)

“二叉排序树,又称为二叉查找树。它或者是一颗空树,或者具有下列性质的二叉树。 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均...
  • wangyunyun00
  • wangyunyun00
  • 2014年04月14日 22:00
  • 17353

二叉排序树的查找、插入、删除、建立

二叉排序树的定义: (1)、如果
  • u011028179
  • u011028179
  • 2014年08月16日 10:45
  • 485

数据结构—二叉搜索树的创建、结点的插入和删除

代码如下: 头文件StudyBST.h #define TRUE 1 #define ERROR 0 #define OK 1 #define REEO...
  • u012258911
  • u012258911
  • 2015年08月29日 15:52
  • 1062

二叉搜索树(BST)的创建、插入、查找和删除

树的结构体定义 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), le...
  • zmq570235977
  • zmq570235977
  • 2016年06月21日 15:48
  • 2226

数据结构与算法之二叉搜索树插入、查询与删除

1 二叉搜索树(BSTree)的概念二叉搜索树又被称为二叉排序树,那么它本身也是一棵二叉树,那么满足以下性质的二叉树就是二叉搜索树: 1、若左子树不为空,则左子树上左右节点的值都小于根...
  • chenliguan
  • chenliguan
  • 2016年10月28日 15:11
  • 1246

二叉排序树的建立、插入、删除、查找、4种遍历 C++完整实现

#include #include #include using namespace std; typedef int KeyType; #define NUM 13 class BinSTree;...
  • u010367506
  • u010367506
  • 2014年04月01日 15:25
  • 2847

二叉搜索树(Binary Search Tree)的递归和非递归代码实现(C++)

二叉搜索树简单介绍二叉搜索树(Binary Search Tree)是满足: 左子树的根节点比树的根节点小 右子树的根节点比树的根节点大 的二叉树。 由于这种数据结构具有很高的查询效率,故多用于需要...
  • dawning7670
  • dawning7670
  • 2016年03月11日 22:59
  • 729

二叉查找树(二叉排序树)创建、插入、删除、查找-C语言

二叉查找树:或者是一颗空树;或者是具有以下性质的二叉树:(1)若它的左子树不为空,则左子树上所有结点的值都小于根结点的值;(2)若它的右子树不为空,则右子树所有结点的值均大于它的根结点的值;(3)左右...
  • haofight
  • haofight
  • 2017年01月12日 21:10
  • 2581
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉搜索树的插入,删除,查找操作
举报原因:
原因补充:

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