如果是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;
}