c语言找出p和q的最近公共祖先结点r

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

  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值