给出节点在数组中的坐标r,有以下规律:
父亲节点下标:Parent(r)=(r-1)/2 当r!=0时,即所给节点不是根节点
左孩子节点下标:Left(r)=2*r+1; 当2*r+1<nodecount;nodecount为当前数的节点数;
右孩子节点下标:Left(r)=2*r+2 当2*r+2<odecount;nodecount为当前数的节点数;
左兄弟节点下标:Leftsibling(r)=r-1; 当r为偶数&&2<=r<=nodecount-1;
右兄弟节点下标:Rightsbling(r)=r+1; 当r为j奇数&&r+1<nodecount;
#include<iostream>
using namespace std;
class tree{
private:
int nodecount;
int* Tree;
int size;
public:
tree(int mysize=100){
nodecount=0;
size=mysize;
Tree=new int[mysize];
}
bool insert(int node){
if(nodecount>=size){
cout<<"树已经满了!"<<endl;
return false;
}
else{
Tree[nodecount++]=node;
return true;
}
}
bool parent(int value,int& item){
if(nodecount==0){cout<<"树是空的!"<<endl;return false;}
for(int i=0;i<nodecount;i++){
if(Tree[i]==value){
if(i==0) {cout<<"所给的数是根节点!"<<endl; return false;}
else {item=Tree[(i-1)/2];return true;}
}
}
cout<<"所给数不是节点!"<<endl;
return false;//所给数不是节点!
}
bool left(int value,int& item){
if(nodecount==0){cout<<"树是空的!"<<endl;return false;}
for(int i=0;i<nodecount;i++){
if(Tree[i]==value){
if((2*i+1<nodecount)) {item=Tree[2*i+1]; return true;}
else {cout<<"左孩子为空!"<<endl;return false;}
}
}
cout<<"所给数不是节点!"<<endl;
return false;//所给数不是节点!
}
bool right(int value,int& item){
if(nodecount==0){cout<<"树是空的!"<<endl;return false;}
for(int i=0;i<nodecount;i++){
if(Tree[i]==value){
if((2*i+2<nodecount)) {item=Tree[2*i+2]; return true;}
else {cout<<"右孩子为空!"<<endl;return false;}
}
}
cout<<"所给数不是节点!"<<endl;
return false;//所给数不是节点!
}
};
int main(){
tree* mytree=new tree(100);
for(int i=0;i<12;i++)
mytree->insert(i);
int value;
if(mytree->parent(100,value))
cout<<value<<endl;
}