Company A面试 笔试 : 完全二叉树,三叉树的最小公共父节点问题


如果是2叉树,那又如何编程?


以下是个人代码,调试通过并有注释

/* 
 *  
 * Author: Bigtree
 *
 * Created on  
 */


 #include < cstdio >  
 #include < cstring >  
 #include < iostream >  
 #include < algorithm >  


 using namespace std;  
long int NodesPerLevel[1000]; //save tree nodes number each level from level 0; NodesPerLevel[1]=3 means at level 1, 3 nodes at this level. 
long int BiggestValuePerLevel[1000]; //the biggest node value at this level. sum[2]=12 means at level 2, the biggest value of node value is 12.


/*
 * argument:
 * depth of complete tree
 * treetype: 3= trip tree, 2= binary tree
 * 
 */


void InitData(int depth, int treetype){
    if(depth<1) return;
    NodesPerLevel[0]=1;
    BiggestValuePerLevel[0]=0;
    for(int i=1;i<depth;i++){
     NodesPerLevel[i]=NodesPerLevel[i-1]*treetype;
     BiggestValuePerLevel[i]=BiggestValuePerLevel[i-1]+ NodesPerLevel[i];
    }
   return;  
}


int getfather(int nodevalue,int treetype) {  
   if(nodevalue <= treetype) 
       return 0;  
    int level;  
     for(level=0;BiggestValuePerLevel[level]<nodevalue;level++); 
     
     level--; //find this nodes' father level  
     
      int fathernodeValue=0;
      int NodeIndex=0; //how far from the father node to the biggest  node at father level
      NodeIndex = (nodevalue - BiggestValuePerLevel[level] -1 )/treetype;
      fathernodeValue = BiggestValuePerLevel[level] - NodeIndex;
      return fathernodeValue;
  }  
//least common parent
 int LCP(int a,int b,int treetype) {  
     while(a != b) {  
        if(a > b) 
            a = getfather(a,treetype);  
         else
             b = getfather(b,treetype);  
        }  
    return a;  
  }  
  
/*
 * 
 */


int main(int argc, char** argv) {
   int fathernode=0;
   int depth=0;
   int node1=0,node2=0;


   cout<<"enter the depth of triple-tree:";
   cin>>depth;
   int treetype;
   cout<<"enter the type of tree(2=binary tree, 3=triple tree etc):";
   cin>>treetype;
   
   InitData(depth,treetype);
   
   
  cout<<"enter the two nodes delimited by space to find LCP: ";
   cin>>node1;
   cin>>node2;
   fathernode=LCP(node1,node2,treetype);
   cout << "node1:" <<node1<<" node2:"<<node2 <<" father node:"<<fathernode<<endl;
   
   return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值