求二叉树种节点的最近的祖先节点
中序遍历:遇到一个节点后将返回值置为1, 如果左右子树返回值都是1那么这就是一个公共祖先,最近就是第一个,做一个标志位判断一下就可以了
代码如下:
// left 2*n + 1 right 2*n +2
int travel(int t[],int s,int l,int* p,int a,int b)
{
int tt = 0;
if(s<l)
{
tt +=travel(t,2*s+1,l,p,a,b);
//cout<<t[s]<<endl;
if(t[s] == a || t[s] == b)
return 1;
tt+=travel(t,2*s+2,l,p,a,b);
}
if(tt == 2 && *p == -1)
{
*p = s;
}
return tt;
}
void main()
{
int tree[]={1,2,3,4,5,6,7,8,9};
int p = -1;
travel(tree,0,sizeof(tree)/sizeof(int),&p,4,6);
cout<<p<<endl;
}
int travel(int t[],int s,int l,int* p,int a,int b)
{
int tt = 0;
if(s<l)
{
tt +=travel(t,2*s+1,l,p,a,b);
//cout<<t[s]<<endl;
if(t[s] == a || t[s] == b)
return 1;
tt+=travel(t,2*s+2,l,p,a,b);
}
if(tt == 2 && *p == -1)
{
*p = s;
}
return tt;
}
void main()
{
int tree[]={1,2,3,4,5,6,7,8,9};
int p = -1;
travel(tree,0,sizeof(tree)/sizeof(int),&p,4,6);
cout<<p<<endl;
}
最近想算法想得头晕 ,是不是不太适合搞代码?哎
码工的无奈啊