#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 50
//求两个结点的最近公共祖先
BiTree getNearestCA(BiTree T,BiTree m,BiTree n){
BiTree stack[MaxSize],p = T,mPre[MaxSize],nPre[MaxSize];
int top = -1,tag[MaxSize] = {0},mtop = -1,ntop = -1;
while(p || top!=-1){
if(p){
stack[++top] = p;
p = p->lchild;
tag[top] = 1;
}else{
p = stack[top];
if(tag[top] == 1){
p = p->rchild;
tag[top] = 2;
}else{
if(p == m){ //当p指向的是m,那就把m所有的祖先都用mPre[]存起来
for(int i=0;i<=top;i++){
mPre[i] = stack[i];
mtop = top;
}
}
if(p == n){ //当p指向的是n,就把n所有的祖先都用nPre[]存起来
for(int i=0;i<=top;i++){
mPre[i] = stack[i];
ntop = top;
}
}
top--;
p = NULL;
}
}
}
//这里可能会出现mPre和nPre两个栈里的元素个数不等长的现象;
//不等长那一段中,绝对不会有公共结点,所以要先比较长度,把长的那一段截掉
//然后让两个栈在同一起跑线(同一长度)开始比较
while(mtop != ntop){ //当两个栈不等长的时候
if(mtop > ntop) //mPre[]长
mtop--; //截mPre[]
else //nPre[]长
ntop--; //截nPre[]
} //(反正就是谁长截谁)
//执行完上面的while循环,就把两个栈截成了等长的状态,
//再在等长的情况下,比较它们 top相等时 所对应的 结点 是否相等
//所以要找到 那个相等的结点(下面是找结点)
while(mPre[mtop--] != nPre[ntop--]); //找结点,找到了相等的,就结束循环
return mPre[mtop]; //确认过眼神,找到了对的点~~返回那个 梦中情点!
}
【数据结构】求两个结点的最近公共祖先
于 2022-10-27 23:17:36 首次发布