1. 程式人生 > >給定陣列,如何快速建立查詢二叉樹

給定陣列,如何快速建立查詢二叉樹

二叉樹查詢一直以來是效率較高的查詢方式,現在我們從基礎開始,假如給定一個數組,如何根據陣列建立二叉樹 ?

轉載請註明出處: http://blog.csdn.net/elfprincexu

現附上截圖:


簡單的策略: 

1. 將陣列從小到大進行排序, 這裡使用std::sort 函式, 自定義mycomp 比較函式,從小到大進行排序。

2. 排序後的陣列從小到大,查詢二叉樹應該是始終是左小右大的規律

3. 遞迴演算法,每次去陣列中間數作為parent, 將剩下的左右陣列做遞迴 (遞迴終止條件為子陣列長度<=0)。

模板:

由於陣列中可能有int , double, float型別, 因此採用模板函式。

附上原始碼,親測可Run...

#include<vector>
#include<Windows.h>
#include<algorithm>
usingnamespacestd;
template<classT>
structnode{
Tdata;
structnode<T>*left;
structnode<T>*right;
};
typedefnode<int>IntNode;
typedefnode<double>DoubleNode;
typedefnode<float
>FloatNode;
template<classT>
voidbuildTree(node<T>*&root,vector<T>&array,intbegin,intend)//hereweuseareferencepointerroot
{
if(begin>end)return;//endingcondition
intmiddle=(begin+end)/2;
if(root==NULL)
{
root=newnode<T>();//createanewnode,ifnotroot,hasitsparent
root->left
=NULL;//setnulltoleft
root->right=NULL;
root->data=array[middle];
}
cout<<root->data<<"";
Sleep(50);
//recursivelybuildleftchildandrightchild
buildTree(root->left,array,begin,middle-1);
buildTree(root->right,array,middle+1,end);
}
template<classT>
intmycmp(Ta,Tb)
{
returna<b;
}
template<classT>
voidtravel(node<T>*root)
{
if(root!=NULL)
{
travel(root->left);
cout<<root->data<<"";
travel(root->right);
}
}
intmain()
{
vector<int>array(100);
for(unsignedinti=0;i<array.size();i++){
array[i]=i;
}
sort(array.begin(),array.end(),mycmp<int>);
for(unsignedinti=0;i<array.size();i++){
cout<<array[i]<<"";
}
cout<<endl;
cout<<"BuildingTree..."<<endl;
IntNode*root=NULL;
buildTree(root,array,0,array.size()-1);
cout<<endl;
cout<<"middletravelbegins"<<endl;
cout<<"root:"<<root<<"root->data:"<<root->data<<endl;
travel(root);
cout<<endl;
return0;
}