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

原创 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;
}




相关文章推荐

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

对于查找和插入操作相对来说比较简单,删除操作则需要考虑的情况较多。 比如有以下些情况,可能有些可以合并,但是我没想到更好的方法,因此代码里有一堆if else,虽然我不喜欢写这样的代码,但也没找到更好...

Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作

1、首先,需要一个节点对象的类。这些对象包含数据,数据代表存储的内容,而且还有指向节点的两个子节点的引用 class Node { public int iData; public double ...

二叉搜索树的查询、插入与删除操作(Binary Search Tree, Search, Insert, Delete)(C++)

一、概念     设 x 是二叉搜索树中的一个结点。如果 y 是 x 左子树中的一个结点,那么 y.key ≦ x.key。如果 y 是 x 右子树中的一个结点,那么 y.key ≧ x.key。 ...

二叉搜索树(BST)的常用操作:建树、插入、查询、删除、排序打印

/* Author:Ibsen Data:2015.12.21 */ //二叉搜索树:建树,插入,删除,排序输出. #include #include using namespace std; c...

二叉搜索树的查找、添加和删除操作

class Node{ int data; Node lChild; Node rChild; public Node(int data){ this.data=data; thi...
  • gluawwa
  • gluawwa
  • 2016年08月29日 18:45
  • 78

二叉搜索树的根插入、选择、删除、合并、排序等操作的实现

源代码如下: 这里的Key 不当为关键字对待, 而是把Item.c作为关键字对待 #include #include //#define Key int typedef int...

二叉搜索树的查找与删除一些基本操作

二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子...

算法导论笔记之----二叉搜索树的插入、删除、搜索操作

#include using namespace std; struct tree { int Key; tree *left; tree *right; }; void SetNull(tre...

Java创建二叉搜索树,实现搜索,插入,删除操作

Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1、查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉搜索树的插入,删除,查找操作
举报原因:
原因补充:

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