• Binary search tree


      1 #ifndef __TREE_H
      2 #define __TREE_H
      3 #include <iostream>
      4 
      5 template<typename T> class TreeNode {
      6 private:
      7     T             _data;
      8     TreeNode<T>* _left;
      9     TreeNode<T>* _right;
     10     TreeNode<T>* _parent;
     11 public:
     12     TreeNode(T data,
     13             TreeNode<T>* parent=0,
     14             TreeNode<T>* left=0,
     15             TreeNode<T>* right=0)
     16         :_data(data),_parent(parent),_left(left),_right(right) {}
     17     void insertAtLeft(T data);
     18     void insertAtRight(T data);
     19     T& getData();
     20     TreeNode<T>*& getLeft();
     21     TreeNode<T>*& getRight();
     22     TreeNode<T>*& getParent();
     23 };
     24 
     25 template<typename T>
     26 T& TreeNode<T>::getData()
     27 {
     28     return _data;
     29 }
     30 
     31 template<typename T>
     32 TreeNode<T>*& TreeNode<T>::getLeft()
     33 {
     34     return _left;
     35 }
     36 
     37 template<typename T>
     38 TreeNode<T>*& TreeNode<T>::getRight()
     39 {
     40     return _right;
     41 }
     42 
     43 template<typename T>
     44 TreeNode<T>*& TreeNode<T>::getParent()
     45 {
     46     return _parent;
     47 }
     48 
     49 template<typename T>
     50 void TreeNode<T>::insertAtLeft(T data)
     51 {
     52     _left = new TreeNode(data,this);
     53 }
     54 
     55 template<typename T>
     56 void TreeNode<T>::insertAtRight(T data)
     57 {
     58     _right = new TreeNode(data,this);
     59 }
     60 
     61 template <typename T> class Tree{
     62 private:
     63     TreeNode<T>* _root;
     64     int          _size;
     65 protected:
     66     TreeNode<T>* findIn(TreeNode<T>* position,T element) const;
     67     /*
     68      * The last tmp argument is necessary,
     69      * it is used here to changed the parent's _left/_right field
     70      * to potint the node which is created 
     71      */
     72     TreeNode<T>* insertIn(TreeNode<T>* position,
     73             T element,TreeNode<T>* tmp);
     74     void travIn(TreeNode<T>* position);
     75     void travPrev(TreeNode<T>* position);
     76     void travPost(TreeNode<T>* position);
     77 public:
     78     Tree(T data)
     79         :_root(new TreeNode<T> (data)),_size(1) { }
     80     TreeNode<T>* find(T element) const;
     81     TreeNode<T>* findMax() const;
     82     TreeNode<T>* findMin() const;
     83     TreeNode<T>* insert(T data);
     84     void traversalIn();
     85     void traversalPrev();
     86     void traversalPost();
     87 };
     88 
     89 template<typename T>
     90 void Tree<T>::travIn(TreeNode<T>* position)
     91 {
     92     if(!position)
     93         return ;
     94     travIn(position->getLeft());
     95     std::cout << position->getData() << " ";
     96     travIn(position->getRight());
     97 }
     98 
     99 template<typename T>
    100 void Tree<T>::travPrev(TreeNode<T>* position)
    101 {
    102     if(!position)
    103         return ;
    104     std::cout << position->getData() << " ";
    105     travPrev(position->getLeft());
    106     travPrev(position->getRight());
    107 }
    108 
    109 template<typename T>
    110 void Tree<T>::travPost(TreeNode<T>* position)
    111 {
    112     if(!position)
    113         return ;
    114     travPost(position->getLeft());
    115     travPost(position->getRight());
    116     std::cout << position->getData() << " ";
    117 }
    118 
    119 template<typename T>
    120 void Tree<T>::traversalPost()
    121 {
    122     travPost(_root);
    123     std::cout << std::endl;
    124 }
    125 
    126 template<typename T>
    127 void Tree<T>::traversalPrev()
    128 {
    129     travPrev(_root);
    130     std::cout << std::endl;
    131 }
    132 
    133 template<typename T>
    134 void Tree<T>::traversalIn()
    135 {
    136     travIn(_root);
    137     std::cout << std::endl;
    138 }
    139 
    140 template<typename T>
    141 TreeNode<T>* Tree<T>::insertIn(TreeNode<T>* position,T data,
    142         TreeNode<T>* tmp)
    143 {
    144     if(!position){
    145         if(!tmp)
    146             return new TreeNode<T>(data);
    147         else
    148             return (tmp->getData() >data ? tmp->getLeft():tmp->getRight())
    149                 = new TreeNode<T>(data,tmp);
    150     }
    151     if(data < position->getData())
    152         insertIn(position->getLeft(),data,position);
    153     else if(position->getData() < data)
    154         insertIn(position->getRight(),data,position);
    155     else 
    156         return position;
    157 }
    158 template<typename T>
    159 TreeNode<T>* Tree<T>::insert(T data)
    160 {
    161     return insertIn(_root,data,0);
    162 }
    163 
    164 template<typename T>
    165 TreeNode<T>* Tree<T>::findIn(TreeNode<T>* position,T data)const
    166 {
    167     while(position && position->getData() != data)
    168     {
    169         if(position->getData() > data)
    170             position = position->getLeft();
    171         else if(position->getData() < data)
    172             position = position->getRight();
    173     }
    174     return position;
    175 }
    176 
    177 template<typename T>
    178 TreeNode<T>* Tree<T>::find(T data) const
    179 {
    180     return findIn(_root,data);
    181 }
    182 
    183 template<typename T>
    184 TreeNode<T>* Tree<T>::findMax() const
    185 {
    186     TreeNode<T>* tmp = _root;
    187     while(tmp->getRight())
    188         tmp = tmp->getRight();
    189     return tmp;
    190 }
    191 
    192 template<typename T>
    193 TreeNode<T>* Tree<T>::findMin() const
    194 {
    195     TreeNode<T>* tmp = _root;
    196     while(tmp->getLeft())
    197         tmp = tmp->getLeft();
    198     return tmp;
    199 }
    200 
    201 #endif

    二叉搜索树

  • 相关阅读:
    Django学习笔记第六篇--实战练习二--简易实现登录注册功能demo
    追踪溯源--抓住隐藏在NAT后面的罪犯
    Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
    Windows2008 IIS配置FTP站点
    .NET RSA解密、签名、验签
    Quartz.NET 入门
    使用Topshelf创建Windows服务
    xcode6 新建项目真机调试无法全屏
    .NET 二维码生成(ThoughtWorks.QRCode)
    iOS手机应用开发原型模板及开发流程
  • 原文地址:https://www.cnblogs.com/ittinybird/p/4563630.html
Copyright © 2020-2023  润新知