1.首先要会的是非递归后序遍历算法,该算法可以帮助找到任意结点的所有祖先结点https://mp.csdn.net/mp_blog/creation/editor/141232025详细做法
2.在“找到任意结点的所有祖先结点”基础上需要修改的是找到p和q 的所有祖先结点后分别放在栈S1和栈S2中,最后从栈底开始比较两个栈,若有相同元素则给到r结点,退出程序,则找到第一个公共祖先结点即最近公共祖先结点
BiTNode *Postorder(BiTNode *p,BiTNode *a,BiTNode *b,BiTNode *r){
SqStack S;
SqStack S1;
SqStack S2;
initSqStack(&S);
initSqStack(&S1);
initSqStack(&S2);
BiTNode *k=NULL;
BiTNode *q=NULL;
while(p||!empty(S)){
if(p!=NULL){
if(p==a){
int i;
for(i=S.top;i>=0;i--)
Push(&S1,S.data[i]);
}
if(p==b){
int i;
for(i=S.top;i>=0;i--)
Push(&S2,S.data[i]);
}
Push(&S,p);
p=p->lchild;
}
else{
p=GetTop(&S);
if(p->rchild&&p->rchild!=k){
p=p->rchild;
}
else{
p=Pop(&S);
k=p;
p=NULL;
}
}
}
int i;
int j;
for(i=0;i<=S1.top;i++){
for(j=0;j<=S2.top;j++){
q=S2.data[j];
r=S1.data[i];
if(q==r)
return r;
}
}
}
3.全部代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MaxSize 10
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTNode *data[MaxSize];
int top;
}SqStack;
void initSqStack(SqStack *S){
S->top=-1;
}
bool empty(SqStack S){
if(S.top==-1){
return true;
}
else{
return false;
}
}
bool Push(SqStack *S,BiTNode *p){
if(S->top==MaxSize-1) return false;
S->data[++S->top]=p;
return true;
}
int Pop(SqStack *S){
if(S->top==-1) return false;
return S->data[S->top--];
}
int GetTop(SqStack *S){
if(S->top==-1) return false;
return S->data[S->top];
}
BiTNode *Postorder(BiTNode *p,BiTNode *a,BiTNode *b,BiTNode *r){
SqStack S;
SqStack S1;
SqStack S2;
initSqStack(&S);
initSqStack(&S1);
initSqStack(&S2);
BiTNode *k=NULL;
BiTNode *q=NULL;
while(p||!empty(S)){
if(p!=NULL){
if(p==a){
int i;
for(i=S.top;i>=0;i--)
Push(&S1,S.data[i]);
}
if(p==b){
int i;
for(i=S.top;i>=0;i--)
Push(&S2,S.data[i]);
}
Push(&S,p);
p=p->lchild;
}
else{
p=GetTop(&S);
if(p->rchild&&p->rchild!=k){
p=p->rchild;
}
else{
p=Pop(&S);
k=p;
p=NULL;
}
}
}
int i;
int j;
for(i=0;i<=S1.top;i++){
for(j=0;j<=S2.top;j++){
q=S2.data[j];
r=S1.data[i];
if(q==r)
return r;
}
}
}
int main() {
BiTree T;
BiTNode *p=(BiTree)malloc(sizeof(BiTNode));
p->data=1;
p->lchild=NULL;
p->rchild=NULL;
BiTNode *m=(BiTree)malloc(sizeof(BiTNode));
m->data=2;
m->lchild=NULL;
m->rchild=NULL;
p->lchild=m;
BiTNode *n=(BiTree)malloc(sizeof(BiTNode));
n->data=4;
n->lchild=NULL;
n->rchild=NULL;
m->rchild=n;
BiTNode *q=(BiTree)malloc(sizeof(BiTNode));
q->data=6;
q->lchild=NULL;
q->rchild=NULL;
m->lchild=q;
BiTNode *a=(BiTree)malloc(sizeof(BiTNode));
a->data=3;
a->lchild=NULL;
a->rchild=NULL;
p->rchild=a;
BiTNode *b=(BiTree)malloc(sizeof(BiTNode));
b->data=5;
b->lchild=NULL;
b->rchild=NULL;
a->rchild=b;
BiTNode *r=(BiTree)malloc(sizeof(BiTNode));
printf("%d",Postorder(p,n,q,r)->data);
return 0;
}
4.所画树为
5.结果展示:所求为q和n的最近公共祖先结点r