• 二叉排序树


    二叉排序树(BinarySortTree)又称二叉查找树,亦称二叉搜索树。

    它或者是一棵空树;或者是具有下列性质的二叉树

    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

    (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

    (3)左、右子树也分别为二叉排序树;

    现在贴出对于二叉树实现的代码。

    二叉树节点

    BTNode.h

      1 #include "stdafx.h"
      2 #include <iostream>
      3 using namespace std;
      4 template <typename Type>class BinaryTree;
      5 template <typename Type>
      6 class BTNode{
      7 public:
      8     friend class BinaryTree<typename Type>;
      9     BTNode():rchild(NULL),lchild(NULL){}
     10     BTNode(Type item , BTNode<Type>*r=NULL,BTNode<Type>*l=NULL):data(item),rchild(r),lchild(l){}
     11     Type getData()const;  // 获取数据
     12     BTNode<Type>* getLeft()const;  // 获取左子树
     13     BTNode<Type>* getRight()const;  // 获取右子树
     14     void setData(const Type data);  // 改变节点值
     15     void setLeft(const BTNode<Type>*l); // 更改左子树的值
     16     void setRight(const BTNode<Type>*r); // 更改右子树的值
     17     void inOrder();       // 中序遍历
     18     void preOrder();  // 前序遍历
     19     void postOrder();  // 后序遍历
     20     int size();  // 获取节点个数
     21     int hight();  // 计算树高
     22     BTNode<Type>* copy(const BTNode<Type> *copy);
     23     friend bool equal<Type>(const BTNode<Type> *s,const BTNode<Type> *t);
     24     void distroy(){  // 销毁树
     25         if(this !=NULL){
     26             this->lchild->distroy();
     27             this->rchild->distroy();
     28             delete this;
     29         }
     30     }
     31 private:
     32     Type data;
     33     BTNode<Type>*lchild;
     34     BTNode<Type>*rchild;  
     35 };
     36  //  获取数据
     37 template <typename Type>
     38 Type BTNode<Type>::getData()const{
     39     return (this == NULL)? -1: data;
     40 }
     41  // 获取左子树
     42 template <typename Type>
     43 BTNode<Type>* BTNode<Type>::getLeft()const{
     44     return (this == NULL)? NULL:lchild;
     45 }
     46 //获取右子树
     47 template <typename Type>
     48 BTNode<Type>* BTNode<Type>::getRight()const{
     49     return (this == NULL)? NULL:rchild;
     50 }
     51 
     52 // 更改节点值
     53 template<typename Type>
     54 void BTNode<Type>::setData(Type data){
     55     if(NULL!=this){
     56         this->data =data;
     57     }
     58     else{
     59         cout<<"can't set"<<endl;
     60     }
     61 }
     62 // 更改左子树
     63 template<typename Type> 
     64 void BTNode<Type>::setLeft(const BTNode<Type> *left){
     65     if(this!=NULL){
     66         lchild=left;
     67     }
     68 }
     69 
     70 // 更改右子树
     71 template<typename Type> 
     72 void BTNode<Type>::setRight(const BTNode<Type> *right){
     73     if(this!=NULL){
     74         rchild=right;
     75     }
     76 }
     77 // 中序遍历
     78 template<typename Type>
     79 void BTNode<Type>::inOrder(){
     80     if(NULL!=this){
     81         this->lchild->inOrder();
     82         cout <<"->"<< this->data ;
     83         this->rchild->inOrder();
     84     }
     85 
     86 }
     87 
     88 // 前序遍历
     89 template<typename Type>
     90 void BTNode<Type>::preOrder(){
     91     if(NULL!=this){
     92         cout <<"->"<< this->data ;
     93         this->lchild->preOrder();
     94         this->rchild->preOrder();
     95     }
     96 }
     97 // 后序遍历
     98 template<typename Type>
     99 void BTNode<Type>::postOrder(){
    100     if(NULL!=this){
    101         this->lchild->postOrder();
    102         this->rchild->postOrder();
    103         cout <<"->"<< this->data ;
    104     }
    105 }
    106 
    107 // 获取树的大小
    108 template<typename Type>
    109 int BTNode<Type>::size(){
    110     if(this==NULL)return 0;
    111     return (1+this->lchild->size()+this->rchild->size());
    112 }
    113 // 计算树的高度
    114 template<typename Type>
    115 int BTNode<Type>::hight(){
    116     if(this==NULL)return -1;
    117     int lhight = this->lchild->hight();
    118     int rhight = this->rchild->hight();
    119     return (1+(lhight>rhight?lhight:rhight));
    120 }
    121 // 拷贝树
    122 template <typename Type>
    123 BTNode<Type>* BTNode<Type>::copy(const BTNode<Type> *copy){
    124     if(copy==NULL)return NULL;
    125     BTNode<Type>*newNode = new BTNode<Type>(copy->data);
    126     newNode->lchild=this->copy(copy->lchild);
    127     newNode->rchild=this->copy(copy->rchild);
    128     return newNode;
    129 }
    130 
    131 //判断两棵树是否相等
    132 template<typename Type>
    133 bool equal(const BTNode<Type> *s,const BTNode<Type> *t){
    134     if(s==NULL&&t==NULL){
    135         return 1;
    136     }
    137     if(s&&t&&s->data==t->data&&equal(s->lchild,t->lchild)&&equal(s->rchild,t->rchild)){
    138         return 1;
    139     }
    140     return 0;
    141 }
    View Code

    二叉树实现

    BinaryTree.h

      1 #include "BTNode.h"
      2 template<typename Type>
      3 class BinaryTree{
      4 public:
      5     BinaryTree():root(NULL){}
      6     BinaryTree(Type stop):m_stop(stop),root(NULL){}
      7     //  拷贝构造函数
      8     BinaryTree(BinaryTree<Type>& copy);
      9     //  析构函数
     10     virtual ~BinaryTree(){
     11         root->distroy();
     12     }
     13     // 判空
     14     virtual bool is_empty(){
     15         return root==NULL;
     16     }
     17      //  获取左子树
     18     virtual BTNode<Type>* getLeft(BTNode<Type>* current);
     19     // 获取右子树
     20     virtual BTNode<Type>* getRight(BTNode<Type>* current);
     21     //  获取父节点
     22     virtual BTNode<Type>* getParent(BTNode<Type>* current);
     23     // 获取根节点
     24     const BTNode<Type>* getRoot() const;
     25     // 插入一个节点
     26     virtual bool insert(const Type item);        
     27     //  查找
     28     virtual BTNode<Type> *find(const Type item) const;    
     29     void inOrder();        // 中序遍历
     30     void preOrder();   // 先序遍历
     31     void postOrder();   // 后序遍历
     32     int size();           // 树的大小
     33     int height();    // 树的高度
     34     BinaryTree<Type>& operator=(const BinaryTree<Type> copy);  // 树赋值
     35     // 判等
     36     friend bool operator== <Type>(const BinaryTree<Type> s,const BinaryTree<Type> t);
     37     // 输入树
     38     friend ostream& operator<< <Type>(ostream& ,BinaryTree<Type>&);    
     39     // 输出树
     40     friend istream& operator>> <Type>(istream& ,BinaryTree<Type>&);    
     41 private:
     42     Type m_stop;
     43     BTNode<Type>*root;
     44     //  获取父节点
     45     BTNode<Type> *getParent(BTNode<Type> *start,BTNode<Type> *current);
     46     // 打印树
     47     void print(BTNode<Type> *start,int n=0);
     48 
     49 };
     50 template <typename Type>
     51 BinaryTree<Type>::BinaryTree(BinaryTree<Type>& copy){
     52     if(copy.root){
     53         this->m_stop = copy.m_stop;
     54     }
     55     root=root->copy(copy.root);
     56 }
     57 template<typename Type>
     58 BTNode<Type>* BinaryTree<Type>::getLeft(BTNode<Type>* current){
     59     return (root&&current?current->lchild:NULL);
     60 }
     61 
     62 template<typename Type>
     63 BTNode<Type>* BinaryTree<Type>::getRight(BTNode<Type>* current){
     64     return (root&&current?current->rchild:NULL);
     65 }
     66 
     67 template<typename Type> 
     68 BTNode<Type>* BinaryTree<Type>::getParent(BTNode<Type> *current){
     69     return root==NULL||current==root?NULL:getParent(root,current);    
     70 }
     71 
     72 template<typename Type>
     73 BTNode<Type>* BinaryTree<Type>::getParent(BTNode<Type>* start,BTNode<Type>* current){
     74     if(start==NULL||current==NULL){
     75         return NULL;
     76     }
     77     if(start->rchild==current||start->lchild==current){
     78         return start;
     79     }
     80     return (!getParent(start->lchild,current)?getParent(start->lchild,current):getParent(start->rchild,current));
     81 }
     82  //  获取root
     83 template <typename Type>
     84 const BTNode<Type>* BinaryTree<Type>::getRoot()const{
     85     return ((NULL!=root)?root:NULL);
     86 }
     87 // 插入节点
     88 template <typename Type>
     89 bool BinaryTree<Type>::insert(const Type item){
     90     BTNode<Type> *newNode = new BTNode<Type>(item);
     91     if(root==NULL){
     92         root = newNode;
     93         return 1;
     94     }
     95     BTNode<Type>*pmove = root;
     96     while(1){
     97         if(item>=pmove->data){
     98             if(pmove->rchild==NULL){
     99                 pmove->rchild = newNode;
    100                 return 1;
    101             }
    102             pmove = pmove->rchild;
    103         }
    104         else{
    105             if(pmove->lchild==NULL){
    106                 pmove->lchild = newNode;
    107                 return 1;
    108             }
    109             pmove = pmove->lchild;
    110         }
    111     }
    112 }
    113 // 查找 item
    114 template<typename Type>
    115 BTNode<Type>* BinaryTree<Type>::find(const Type item)const{
    116     if(root==NULL)return NULL;
    117     BTNode<Type> * pmove = root;
    118     while(pmove){
    119         if(item==pmove->data)return pmove;
    120         else if(item>pmove->data){
    121             pmove=pmove->rchild;
    122         }
    123         else{
    124             pmove = pmove->lchild;
    125         }
    126     }
    127     return NULL;
    128 }
    129 // 中序遍历
    130 template<typename Type>
    131 void BinaryTree<Type>::inOrder(){
    132     if(root==NULL){
    133         cout << "this is a empty tree" <<endl;
    134         return;
    135     }
    136     root->inOrder();
    137 }
    138 //先序遍历
    139 template<typename Type>
    140 void BinaryTree<Type>::preOrder(){
    141     if(root==NULL){
    142         cout << "this is a empty tree" <<endl;
    143         return;
    144     }
    145     root->preOrder();
    146 }
    147 //后序遍历
    148 template<typename Type>
    149 void BinaryTree<Type>::postOrder(){
    150     if(root==NULL){
    151         cout << "this is a empty tree" <<endl;
    152         return;
    153     }
    154     root->postOrder();
    155 }
    156 
    157 //树的大小
    158 template <typename Type>
    159 int BinaryTree<Type>::size(){
    160     if(root==NULL)return 0;
    161     return root->size();
    162 }
    163 //树的高度
    164 template <typename Type>
    165 int BinaryTree<Type>::height(){
    166     if(root==NULL)return 0;
    167     return root->hight();
    168 }
    169 // 赋值
    170 template <typename Type>
    171 BinaryTree<Type>& BinaryTree<Type>::operator=(const BinaryTree<Type>copy){
    172     if(copy->root){
    173         m_stop = copy.m_stop;
    174     }
    175     root = root->copy(copy.root);
    176     return *this;
    177 }
    178 // 判等
    179 template<typename Type>
    180 bool operator==(const BinaryTree<Type> s,const BinaryTree<Type> t){
    181     return equal(s.root,t.root);
    182 }
    183 // 输出
    184 template<typename Type>
    185 ostream& operator<<(ostream&os ,BinaryTree<Type>&out){
    186     out.print(out.root);
    187     return os;
    188 }
    189 //输入
    190 template<typename Type>
    191 istream& operator>>(istream&is ,BinaryTree<Type>&in){
    192     Type item;
    193     cout<<"initialize the tree:"<< endl 
    194         << "Input data(end with "<<in.m_stop<<"!):";
    195     is >>item;
    196     while(item!=in.m_stop){    
    197         in.Insert(item);
    198         is>>item;
    199     }
    200     return is;
    201 }
    202 template<typename Type> void BinaryTree<Type>::print(BTNode<Type> *start, int n){
    203     if(start==NULL){
    204         for(int i=0;i<n;i++){
    205             cout<<"     ";
    206         }
    207         cout<<"NULL"<<endl;
    208         return;
    209     }
    210     print(start->rchild,n+1);    
    211     for(int i=0;i<n;i++){
    212         cout<<"     ";
    213     }
    214     if(n>=0){
    215         cout<<start->data<<"->"<<endl;
    216     }
    217     print(start->lchild,n+1);
    218 }
    View Code
  • 相关阅读:
    周末单车行
    大笨
    随谈个人所得税起征点
    我的新球拍
    谈“家乐福抵制门”事件
    49届世乒赛(团体)电视转播时间表
    上海动物园拍摄记
    一个老外的故事
    请大家帮忙推荐一款名片管理软件
    不要先挂电话
  • 原文地址:https://www.cnblogs.com/bobo0892/p/4000532.html
Copyright © 2020-2023  润新知