二叉查找树--C++

#include "stdafx.h"
#include <iostream>
using namespace std;



/*
二叉查找树的性质:
1.二叉排序树或为空树
2.若左子树不为空,则左子树中所有节点的值均小于或等于根节点
3.若右子树不为空,则右子树中所有节点的值均大于或等于跟节点
4.左右子树也为二叉排序树
(5.二叉排序树采用中序历遍(从左到右)输出的时候是有序的)
*/

//#define T int

//节点数据结构
template<class V,class K>
struct NODE{
	V value;
	K key;
	NODE *left;
	NODE *right;
	NODE(K key_,V value_,NODE *left_,NODE *right_)
	{
		value = value_; key = key_;
		left = left_; right = right_;
	}
	NODE(K key_,V value_)
	{
		value = value_; key = key_;
		left = NULL; right = NULL;
	}
	NODE()
	{}
};

//插入,根节点不能为空,键值不可重复 ,插入失败返回false:(1)键值重复(2)参数为NULL(3)根为空
//插入的节点必须是使用new分配的,因为要采用delete释放
template<class V,class K>
bool insert(NODE<V,K> *root, NODE<V,K> *node)
{
	if(NULL == node){
		return false;
	}
	//空树
	if(NULL == root){
		return false;
	}
	//非空树
	NODE<V,K> *pointer = root;//指向二叉树的指针
	//找出插入的所在节点
	while(true)
	{
		if(pointer->key == node->key){
			return false;
		}
		else if(node->key > pointer->key){
			if(pointer->right != NULL){
				pointer = pointer->right;
			}
			else{
				pointer->right = node;
				return true;
			}
		}
		else{
			if(pointer->left != NULL){
				pointer = pointer->left;
			}
			else{
				pointer->left = node;
				return true;
			}
		}
	}
}

//中序历遍
template<class V,class K>
void middlePrint(const NODE<V,K> * const node)
{
	if(NULL == node)
		return;
	if(NULL != node->left){
		middlePrint<V,K>(node->left);
	}
	//cout<<node->key<<"-"<<node->value<<endl;//中序,就是在中间输出,前序与后序同理
	cout<<node->key<<" ";
	if(NULL != node->right){
		middlePrint<V,K>(node->right);
	}
}

//查找 返回NULL表示没找到
template<class V,class K>
NODE<V,K>* search( NODE<V,K> *root, K key)
{
	NODE<K,V> *re = new NODE<K,V>();
	if(NULL == root)
		return NULL;
	NODE<V,K> *pointer = root;
	while(true)
	{
		if(pointer->key == key)
		{
			re->key = key;
			re->value = pointer->value;
			return re;
		}
		else if(key > pointer->key)
		{
			if(NULL == pointer->right){
				return NULL;
			}
			else{
				pointer = pointer->right;
			}
		}
		else{
			if(NULL == pointer->left){
				return NULL;
			}
			else{
				pointer = pointer->left;
			}
		}
	}
}

//删除--如果不存在就返回false
template<class V,class K>
bool delete_node(NODE<V,K> **root, K key)
{
	NODE<V,K> *p = *root;
	NODE<V,K> *parent = *root;
	NODE<V,K> *temp = NULL;
	while(p != NULL)
	{
		if(p->key == key)
			break;
		else if(key > p->key){
			parent = p;
			p = p->right;
		}
		else{
			parent = p;
			p = p->left;
		}
	}
	//如果没找到就返回false
	if(NULL == p)
		return false;
	//删除
	//要删除的节点为根节点
	if(*root == p)
	{
		temp = *root;
		//右子树不为空
		if(NULL != p->right)
		{
			//右子树的左子树为空
			if(NULL == p->right->left)
			{
				p->right->left = p->left;
				*root = p->right;
			}
			//右子树的左子树不为空
			else
			{
				NODE<V,K> *p1 = p->right->left;
				while(p1->left != NULL)
				{
					parent = p1;
					p1 = p1->left;
				}
				if(p1->right == NULL)
				{
					parent->left = NULL;
					p1->left = (*root)->left;
					p1->right = (*root)->right;
					*root = p1;
				}
				else
				{
					parent->left = p1->right;
					p1->left = (*root)->left;
					p1->right = (*root)->right;
					*root = p1;
				}
			}
		}
	}
	//叶子节点
	else if(NULL == p->left && NULL == p->right)
	{
		if(parent->left == p)
		{
			temp = parent->left;
			parent->left = NULL;
		}
		else
		{
			temp = parent->right;
			parent->right = NULL;
		}
	}
	//该节点只有左子树或又子树
	else if(NULL == p->left || NULL == p->right)
	{
		temp = p;
		if(parent->left == p)
		{
			if(p->left != NULL)
				parent->left = p->left;
			else
				parent->left = p->right;
		}
		else
		{
			if(p->left != NULL)
				parent->right = p->left;
			else
				parent->right = p->right;
		}
	}
	//左右子树皆不为空
	else if(p->left != NULL && p->right != NULL)
	{
		temp = p;
		//右子树的左子树为空
		if(NULL == p->right->left)
		{
			p->right->left = p->left;
			if(parent->left == p)
				parent->left = p->right;
			else
				parent->right = p->right;
		}
		//右子树的左子树不为空
		else
		{
			NODE<V,K> *p1 = p->right->left;
			NODE<V,K> *parent2 = p->right;
			while(p1->left != NULL)
			{
				parent2 = p1;
				p1 = p1->left;
			}
			parent2->left = p1->right;
			p1->left = p->left;
			p1->right = p->right;
			if(parent->left == p)
				parent->left = p1;
			else 
				parent->right = p1;
		}

	}

	if(temp != NULL){
		delete temp;
		return true;
	}
	else
		return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
	NODE<int,int> *root = new NODE<int,int>(50,50);
	for(int i = 0;i < 20; i++)
	{
		int key = rand()%100;
		int value = rand()%100;
		NODE<int,int> *node = new NODE<int,int>(key,value);
		insert<int,int>(root,node);
		cout<<key<<" ";
	}
	cout<<endl;
	middlePrint<int,int>(root);
	cout<<"-------------------"<<endl;
	NODE<int,int> *node = search<int,int>(root,35);
	if(NULL == node){
		cout<<"不存在的Key"<<endl;
	}
	else{
		cout<<node->key<<"-"<<node->value<<endl;
	}
	cout<<"-------------------"<<endl;//2 5 18 21 27 34 35 41 47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,2);			  //  5 18 21 27 34 35 41 47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,5);			  //2   18 21 27 34 35 41 47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,18);		  //2 5    21 27 34 35 41 47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,21);		  //2 5 18    27 34 35 41 47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,27);		  //2 5 18 21    34 35 41 47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,34);		  //2 5 18 21 27    35 41 47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,35);		  //2 5 18 21 27 34    41 47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,41);		  //2 5 18 21 27 34 35    47 50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,47);		  //2 5 18 21 27 34 35 41    50 61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,50);		  //2 5 18 21 27 34 35 41 47    61 62 67 69 71 78 81 91 92 95
	//delete_node(&root,61);		  //2 5 18 21 27 34 35 41 47 50    62 67 69 71 78 81 91 92 95
	//delete_node(&root,62);		  //2 5 18 21 27 34 35 41 47 50 61    67 69 71 78 81 91 92 95
	//delete_node(&root,67);		  //2 5 18 21 27 34 35 41 47 50 61 62    69 71 78 81 91 92 95
	//delete_node(&root,69);		  //2 5 18 21 27 34 35 41 47 50 61 62 67    71 78 81 91 92 95
	//delete_node(&root,71);		  //2 5 18 21 27 34 35 41 47 50 61 62 67 69    78 81 91 92 95
	//delete_node(&root,78);		  //2 5 18 21 27 34 35 41 47 50 61 62 67 69 71    81 91 92 95
	//delete_node(&root,81);		  //2 5 18 21 27 34 35 41 47 50 61 62 67 69 71 78    91 92 95
	//delete_node(&root,91);		  //2 5 18 21 27 34 35 41 47 50 61 62 67 69 71 78 81    92 95
	//delete_node(&root,92);		  //2 5 18 21 27 34 35 41 47 50 61 62 67 69 71 78 81 91    95
	//delete_node(&root,95);		  //2 5 18 21 27 34 35 41 47 50 61 62 67 69 71 78 81 91 92   
	middlePrint<int,int>(root);		  //2 5 18 21 27 34 35 41 47 50 61 62 67 69 71 78 81 91 92 95
	getchar();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值