数组实现完全二叉树

给出节点在数组中的坐标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;
}


 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值