您的位置:首页 > 其它

满二叉排序树任意三个节点最近公共父节点

2017-06-19 14:46 211 查看
#include <iostream>

using namespace std;
int tree[1024*1024];
int k;
int a,b,c;
int power2(int n)
{
int i=1;
int j;
for(j=0; j<n; j++)
i=i*2;
return i;
}
int get_xiabiao(int n)
{
int i,j;
int xiabiao=-1;
for(i=0; i<power2(k)-1; i++)
{
if(tree[i]==n)
{
xiabiao=i;
break;

}
}
return xiabiao;

}
int get_shendu(int n)
{
int i=0;
for(i=0; n; i++)
{
n=(n-1)/2;
}
return i;

}
int main()
{
cin>>k>>a>>b>>c;
int i,j;
int m;
for(i=0; i<k; i++)
{
int start=power2(k-1-i);
for(j=power2(i)-1,m=0; j<power2(i+1)-1; j++,m++)
{
tree[j]=start+start*2*m;
}
}

int a_xiabiao=get_xiabiao(a);
int b_xiabiao=get_xiabiao(b);
int c_xiabiao=get_xiabiao(c);
int a_shendu=get_shendu(a_xiabiao);
int b_shendu=get_shendu(b_xiabiao);
int c_shendu=get_shendu(c_xiabiao);

int Min=1<<30;
if(Min>a_shendu)Min=a_shendu;
if(Min>b_shendu)Min=b_shendu;
if(Min>c_shendu)Min=c_shendu;

for(i=0; i<a_shendu-Min; i++)
a_xiabiao=(a_xiabiao-1)/2;
for(i=0; i<b_shendu-Min; i++)
b_xiabiao=(b_xiabiao-1)/2;
for(i=0; i<c_shendu-Min; i++)
c_xiabiao=(c_xiabiao-1)/2;

for(i=0; i<Min; i++)
{
if(a_xiabiao==b_xiabiao&&b_xiabiao==c_xiabiao)
{
break;
}
else
{
a_xiabiao=(a_xiabiao-1)/2;
b_xiabiao=(b_xiabiao-1)/2;
c_xiabiao=(c_xiabiao-1)/2;
}
}
cout<<tree[a_xiabiao]<<endl;
return 0;
}

#include <iostream>

using namespace std;
int k,a,b,c;
struct tree
{
int data;
tree *left;
tree *right;
};
int power2(int n)
{
int i=1;
for(int j=0; j<n; j++)
i=i*2;
return i;

}
void create(tree *root,int n)
{
if(n==k)
{
root->data=power2(n-1);
}
if(n==k-2)
{
tree *tree_left=new tree;
tree *tree_right=new tree;

root->left=tree_left;
root->right=tree_right;

tree_left->data=root->data-power2(n-2);
tree_right->data=root->data+power2(n-2);

return ;
}
tree *tree_left=new tree;
tree *tree_right=new tree;
root->left=tree_left;
root->right=tree_right;

tree_left->data=root->data-power2(n-2);
create(root->left,n-1);
tree_right->data=root->data+power2(n-2);
create(root->right,n-1);
return ;
}
tree *FindParent2(tree*root,tree*a,tree*b)
{
if(root==NULL)
return NULL;
if(root==a||root==b)
return root;
tree*left=FindParent2(root->left,a,b);
tree*right=FindParent2(root->right,a,b);
if(left&&right)
return root;
return left?left:right;
}
tree *FindParent(tree*root,tree*a,tree*b)
{
int min,max;
if(a->data<b->data)
{
min=a->data,max=b->data;
}
else
{
min=b->data,max=a->data;
}
while(root)
{
if(root->data>=min&&root->data<=max)
return root;
else    if(root->data<min&&root->data<max)
{
root=root->right;
}
else root=root->left;

}
return NULL;

}
tree *Find(tree*root,int n)
{
if(root->data==n)
{
return root;

}
else if(root->data<n)
{
return Find(root->right,n);
}
return Find(root->left,n);
}
int main()
{
cin>>k>>a>>b>>c;
tree *root=new tree;
create(root,k);

tree *atree=new tree;
tree *btree=new tree;
tree *ctree=new tree;
atree=Find(root,a);
btree=Find(root,b);
ctree=Find(root,c);
tree *abparent=new tree;
abparent=FindParent(root,atree,btree);

tree *abcparent=new tree;
abcparent=FindParent(root,abparent,ctree);
cout<<abcparent->data<<endl;

/*
tree *abparent2=new tree;
abparent2=FindParent2(root,atree,btree);

tree *abcparent2=new tree;
abcparent2=FindParent2(root,abparent2,ctree);
cout<<abcparent2->data<<endl;
*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树