C++手写二叉搜索树

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值