#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;
}
二叉查找树--C++
最新推荐文章于 2025-04-15 20:35:13 发布