#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
using namespace std;
#define MAXVALUE (10000)
#define MINVALUE (-10000)
/*
二叉搜索树
包含二叉树的
节点添加 Tree_Node<T> * insert_Node(Tree_Node<T> * root_Node , int x),
节点删除 Tree_Node<T>* Delete_Node(Tree_Node<T>*root_Node,int data),
前序遍历 void Show_Tree_qian(Tree_Node<T> * root_Node),
中序遍历 void Show_Tree_zhong(Tree_Node<T> * root_Node),
后序遍历 void Show_Tree_hou(Tree_Node<T> * root_Node),
层遍历 void Show_Tree_ceng(Tree_Node<T> * root_Node),
判断一个树是否为搜索二叉树 bool IsBinarySearchTree(Tree_Node<T> * root_Node,int max_value,int min_value)
*/
template<typename T>
struct Tree_Node {
T data;
struct Tree_Node * left;
struct Tree_Node * right;
};
template<typename T>
Tree_Node<T> * insert_Node(Tree_Node<T> * root_Node , int x){
Tree_Node<T> * temp =(Tree_Node<T> *)malloc(sizeof(Tree_Node<T>));
temp->data=x;
temp->left=NULL;
temp->right=NULL;
if(root_Node == NULL){
root_Node = temp;
}else{
Tree_Node<T> * p =root_Node,*q=NULL;
while (p!=NULL)
{
q=p;
if( x <=p->data){
p=p->left;
}else{
p=p->right;
}
}
if(x<=q->data){
q->left=temp;
}else{
q->right=temp;
}
}
return root_Node;
}
template<typename T>
void Show_Tree_zhong(Tree_Node<T> * root_Node){
if(root_Node != NULL){
Show_Tree_zhong(root_Node->left);
cout<<root_Node->data<<'\t';
Show_Tree_zhong(root_Node->right);
}
}
template<typename T>
void Show_Tree_qian(Tree_Node<T> * root_Node){
if(root_Node != NULL){
cout<<root_Node->data<<'\t';
Show_Tree_qian(root_Node->left);
Show_Tree_qian(root_Node->right);
}
}
template<typename T>
void Show_Tree_hou(Tree_Node<T> * root_Node){
if(root_Node != NULL){
Show_Tree_hou(root_Node->left);
Show_Tree_hou(root_Node->right);
cout<<root_Node->data<<'\t';
}
}
template<typename T>
void Show_Tree_ceng(Tree_Node<T> * root_Node){
if(root_Node == NULL) return;
queue<Tree_Node<T> *> temp;
temp.push(root_Node);
while(!temp.empty()){
Tree_Node<T> *p = temp.front();
cout<<p->data<<'\t';
if(p->left!=NULL)temp.push(p->left);
if(p->right!=NULL)temp.push(p->right);
temp.pop();
}
}
//判断是否为搜索二叉树
template<typename T>
bool IsBinarySearchTree(Tree_Node<T> * root_Node,int max_value,int min_value){
if(root_Node == NULL)return true;
if(root_Node->data<=max_value
&&root_Node->data>min_value
&&IsBinarySearchTree(root_Node->left,root_Node->data,min_value)
&&IsBinarySearchTree(root_Node->right,max_value,root_Node->data))
return true;
else
return false;
}
template<typename T>
bool IsBstUtil(Tree_Node<T> * root_Node){
return IsBinarySearchTree(root_Node,MAXVALUE,MINVALUE);
}
template<typename T>
Tree_Node<T> *FindMin(Tree_Node<T> *root_Node){
while(root_Node->left != NULL){
root_Node = root_Node->left;
}
return root_Node;
}
template<typename T>
Tree_Node<T>* Delete_Node(Tree_Node<T>*root_Node,int data){
if(root_Node == NULL)return root_Node;
else if(data < root_Node->data) root_Node->left=Delete_Node(root_Node->right,data);
else if(data > root_Node->data) root_Node->right=Delete_Node(root_Node->right,data);
else{
if(root_Node->left == NULL && root_Node->right ==NULL){
free(root_Node);
root_Node =NULL;
return root_Node;
}
else if(root_Node->left == NULL){
Tree_Node<T> * temp = root_Node;
root_Node=root_Node->right;
free(temp);
return root_Node;
}
else if(root_Node->right == NULL){
Tree_Node<T> * temp = root_Node;
root_Node=root_Node->left;
free(temp);
return root_Node;
}
else{
Tree_Node<T> * temp = FindMin(root_Node->right);
root_Node->data = temp->data;
root_Node->right = Delete_Node(root_Node->right,temp->data);
}
}
return root_Node;
}
int main(int argc, char const *argv[])
{
Tree_Node<int> * root_Node =NULL;
printf("how many number?\n");
int n,x;
scanf("%d",&n);
for (int i = 0; i < n; i++) {
printf("Enter the number \n");
scanf("%d", &x);
root_Node=insert_Node(root_Node,x);
}
printf("中续遍历:");
Show_Tree_zhong(root_Node);
printf("\n");
printf("前续遍历:");
Show_Tree_qian(root_Node);
printf("\n");
printf("后续遍历:");
Show_Tree_hou(root_Node);
printf("\n");
printf("层遍历:");
Show_Tree_ceng(root_Node);
printf("\n");
cout<< IsBstUtil(root_Node)<<endl;
Delete_Node(root_Node,9);
printf("中续遍历:");
Show_Tree_zhong(root_Node);
printf("\n");
return 0;
}
C++手写二叉搜索树
最新推荐文章于 2024-09-15 11:40:06 发布