數據結構與算法——搜索二叉樹

        基礎的數據結構通常都會包含插入、刪除、查找和修改等幾個基本的操做。對於搜索二叉樹而言,數據的插入和刪除操做都是在葉子結點進行。搜索二叉樹主要方便於數據的查找,其查找算法複雜度爲O(h),h表示其樹高,而二叉樹的高度h在lgN和N之間,所以,查找算法強烈依賴於樹形的好壞,而樹形的好壞與數據的增加有關。對於好的數據輸入,二叉樹能夠是平衡的高度爲lgN,然而很難保證都是這種狀況。對於壞的數據輸入二叉樹甚至可能退化成鏈表,其查找的複雜度爲N,這是咱們最不但願看到的。node

        本文以C++做爲算法語言編寫二叉樹的一個模版BinarySearchTree<T>,T能夠是任何基礎數據類型,在linux環境下g++編譯經過。linux

#ifndef _BINARYSEARCHTREE_
#define _BINARYSEARCHTREE_
#include<iostream>
#include<cstdio>
template<typename T>
struct Node
{
  T data;
  Node* left;
  Node* right;
  Node<T>(T node=0):data(node){}
};

template<typename T>
class BinarySearchTree
{
private:
  Node<T> * root;
  unsigned int size;
  int num;
public:
  BinarySearchTree();//:root(NULL){}
  ~BinarySearchTree();
private:
  void destroyTree(Node<T>*);
public:
  Node<T>* getRootNode();
  unsigned int getSize();
  bool createTree(T d);
  bool addNode(T d);
  const Node<T> * findNode(T d,Node<T>* &) const; 
  void preorderdisplayNode(Node<T>*);
  void inorderdisplayNode(Node<T>*);
  void postorderdisplayNode(Node<T>*);
};

template<typename T>
BinarySearchTree<T>::BinarySearchTree():root(NULL),size(0),num(0)
{

}
 
template<typename T>
BinarySearchTree<T>::~BinarySearchTree()
{
   destroyTree(getRootNode());
}
 
template<typename T>
Node<T>* BinarySearchTree<T>::getRootNode()
{
   Node<T>* rootNode=this->root;
   return rootNode;
}
template<typename T>
unsigned int BinarySearchTree<T>::getSize()
{
  return this->size;
}

template<typename T>
void BinarySearchTree<T>::destroyTree(Node<T>* node)
{
  if(!node){
  delete node;
  destroyTree(node->left);
  destroyTree(node->right);
  }
}

template<typename T>
bool BinarySearchTree<T>::createTree(T d)
{
  if(!this->root){
     this->root=new Node<T>(d);
     size++;
     this->root->left=NULL;
     this->root->right=NULL;
     return true;
  }
  else{
    return true;
  }
  
}

template<typename T>
bool BinarySearchTree<T>::addNode(T d)
{
 Node<T>* parent= this->getRootNode();
    if(!parent){
      printf("error,the tree is  empty!\n");
      return false;
    }
    Node<T>* iPtr=parent;
    Node<T>* tmp=NULL;
    while(iPtr){
      if(d<=iPtr->data){
         tmp=iPtr;
         iPtr=iPtr->left;
      }
      else if(d>iPtr->data){
         tmp=iPtr;
         iPtr=iPtr->right;
      }
      else{
         throw "something error!";
      }
    }
    if(d>tmp->data){
      tmp->right=new Node<T>(d);
      size++;
    }
    else{
      tmp->left= new Node<T>(d);
      size++;
    }
 return true; 
}

template<typename T>
const Node<T> * BinarySearchTree<T>::findNode(T d,Node<T>* &node) const
{
   Node<T> * tmpNode=node;
   if(!tmpNode) return tmpNode;
   if(d>tmpNode->data){
     tmpNode=tmpNode->right;
     findNode(d,tmpNode);
     return tmpNode;
   }
   else if(d<tmpNode->data){
     tmpNode=tmpNode->left;
     findNode(d,tmpNode);
     return tmpNode;
   }
   else if(d==tmpNode->data){
     return tmpNode;
   }
   else {
     return NULL;
   }
}

template<typename T>
void BinarySearchTree<T>::inorderdisplayNode(Node<T>* node)
{
  Node<T>* tmpPtr=node;
  if(tmpPtr){
    inorderdisplayNode(tmpPtr->left);
    printf("%d ",tmpPtr->data);
    inorderdisplayNode(tmpPtr->right);
  }
  num=0;
}
template<typename T>
void BinarySearchTree<T>::preorderdisplayNode(Node<T>* node)
{
  Node<T>* tmpPtr=node;
  if(tmpPtr){
    printf("%d ",tmpPtr->data);
    preorderdisplayNode(tmpPtr->left);
    preorderdisplayNode(tmpPtr->right);
  }
  num=0;
}
template<typename T>
void BinarySearchTree<T>::postorderdisplayNode(Node<T>* node)
{
  Node<T>* tmpPtr=node;
  if(tmpPtr){
    postorderdisplayNode(tmpPtr->left);
    postorderdisplayNode(tmpPtr->right);
    printf("%d ",tmpPtr->data);
  }
  num=0;
}
#endif //binarysearchtree.h
#include<iostream>
#include"searchbinarytree.h"
using namespace std;

int main()
{
  BinarySearchTree<int> Tree1;
  Tree1.createTree(5); 
  Tree1.addNode(4);
  Tree1.addNode(7);
  Tree1.addNode(1);
  Tree1.addNode(2);
  Tree1.addNode(0);
  Tree1.addNode(3);
  Tree1.addNode(6);
  Tree1.addNode(8);
  Tree1.addNode(9);
  cout<<"inorder display node:"<<endl;
  Tree1.inorderdisplayNode(Tree1.getRootNode()); 
  endl(cout);
  cout<<"preorder display node:"<<endl;
  Tree1.preorderdisplayNode(Tree1.getRootNode()); 
  endl(cout);
  cout<<"postorder display node:"<<endl;
  Tree1.postorderdisplayNode(Tree1.getRootNode()); 
  endl(cout);
return 0;
}

對於一組數據,這裏以0~9爲例,不一樣的輸入將形成樹形的不一樣,從而影響查找數據的效率。ios

 

 

 

 

 

 

 

 

 

 

 

高度爲4算法

 

 

 

 

 

 

 

 

 

 

 

 

高度爲10,此時二叉樹退化成鏈表,其查找算法複雜度和鏈表同樣。數據結構

相關文章
相關標籤/搜索