二叉查找树--C++

来源:互联网 发布:广州大学生数据分析 编辑:程序博客网 时间:2024/06/06 20:02
#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;}}}}//删除--如果不存在就返回falsetemplate<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;}}//如果没找到就返回falseif(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;elseparent->left = p->right;}else{if(p->left != NULL)parent->right = p->left;elseparent->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;elseparent->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;}elsereturn 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 95getchar();return 0;}

0 0