题目描述:
一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号i和j的最近公共祖先
思路:
已知:二叉树、顺序存储
空的结点用“#”表示
如果i,j所在位置的结点数据不是“#”,才有公共结点;
若i<j,则j和i可能在同一层,或者比i的层数高,找j的双亲结点,j/2,再重复进行比较;
若i>j,则i和j可能在同一层,或者比j的层数高,找i的双亲结点,i/2,再重复进行比较;
直到i==j,就是最近公共结点的编号。
#include<stdio.h>
//二叉树顺序存储结构
#define MXASIZE 20
typedef struct Bt{
int no;
char num;
}BiTNode;
typedef struct BT{
BiTNode data[MXASIZE];
}SqTree,*ST;
//求二叉树两个节点的最近公共祖先
char common(ST T,int i,int j){
if(i==j)
return T->data[i].num;
else if(i>j){
return common(T,i/2,j);
}
else
return common(T,i,j/2);
}
int main(){
ST T;
SqTree t;
char ch;
int n,m;
int i=1;
T=&t;//如果利用指针进行访问,这是关键的一步,指针变量初始化
ch='a';
#if(0)
//**这里直接访问结构成员**
for(i=1;i<7;i++){
t.data[i].no=i;
t.data[i].num=ch;
ch++;
}
t.data[5].num='#';
for(i=1;i<7;i++){
printf("%d %c\n",t.data[i].no,t.data[i].num);
}
scanf("%d%d",&n,&m);
if(t.data[n].num!='#'&&t.data[m].num!='#'){
printf("%c\n",common(T,n,m));
}
#endif
//**这里采用指针进行访问**
for(i=1;i<7;i++){
T->data[i].no=i;
T->data[i].num=ch;
ch++;
}
T->data[5].num='#';
for(i=1;i<7;i++){
printf("%d %c\n",T->data[i].no,T->data[i].num);
}
//T->data[5].num='#';
scanf("%d%d",&n,&m);
if(T->data[n].num!='#'&&T->data[m].num!='#'){
printf("%c\n",common(T,n,m));
}
return 0;
}