基礎的數據結構通常都會包含插入、刪除、查找和修改等幾個基本的操做。對於搜索二叉樹而言,數據的插入和刪除操做都是在葉子結點進行。搜索二叉樹主要方便於數據的查找,其查找算法複雜度爲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,此時二叉樹退化成鏈表,其查找算法複雜度和鏈表同樣。數據結構