二叉树中两个节点的最短路径

二叉树中两个节点的最短路径

步骤:求节点6到4的最短路径
1、采用后续遍历的方式求出根节点分别到两个节点的距离路径:1->3->6;1->2->4;
2、最近公共祖先:1
3、第一个路径从后往前输出且包含公共祖先,第二个路径从最近公共祖先+1开始从前往后输出。

#include<stdio.h> 

#include<iostream>
using namespace std;
//#define MaxSize 50
#include<stdlib.h>
typedef int ElemType;
typedef struct BiTNode{
int data;
BiTNode	*left;
BiTNode *right;
BiTNode(){this->right = NULL; this->left = NULL;}

}BiTNode,*BiTree;

typedef struct {
BiTree t;
int tag;	
}stack;
//后续遍历求路径 
void findshortpath(BiTree root,stack s[],BiTNode *p,int &top){
//static int top=0;
BiTNode *bt=root;

while(bt!=NULL||top>0){
	while(bt!=NULL&& bt!=p){
		s[++top].t=bt;
		s[top].tag=0;
		bt=bt->left;
	}
	if(bt==p){
		s[++top].t=bt;
		return ;
	}
	while(top!=0&&(s[top].tag==1||s[top].t->right==NULL)){
		top--;
	}
	if(top!=0){
	     s[top].tag=1;
		 bt=s[top].t->right;	
	}
	
}
	
}
  
int main(){
//构建一颗从1->6编号的顺序二叉树 
stack s[6]={NULL};BiTNode *p;
stack s1[6]={NULL};
BiTNode *n6= (BiTNode*)malloc(sizeof(BiTNode));
n6->data=6;
BiTNode *n5= (BiTNode*)malloc(sizeof(BiTNode));
n5->data=5;
BiTNode *n4= (BiTNode*)malloc(sizeof(BiTNode));
n4->data=4;
n4->left=NULL;n4->right=NULL;
BiTNode *n3= (BiTNode*)malloc(sizeof(BiTNode));
n3->data=3;
n3->left=n6;
BiTNode *n2= (BiTNode*)malloc(sizeof(BiTNode));
n2->data=2;
n2->left=n4;
n2->right=n5;
BiTNode *n1= (BiTNode*)malloc(sizeof(BiTNode));
n1->data=1;
n1->left=n2;
n1->right=n3;
p=n6;
BiTNode* q=n4;
n5->left=NULL;n5->right=NULL;
n6->left=NULL;n6->right=NULL;
int top=0;int top1=0;
//调用2次求路径 
findshortpath(n1,s,p,top);
findshortpath(n1,s1,q,top1);

//寻找最近公共祖先 
int common=1;
for(int i=1;i<=min(top,top1);i++){
	if(s[i].t==s1[i].t){
		common=i;
	}
}
//开始输出路径 
for(int j=top;j>=common;j--){
cout<<s[j].t->data<<endl;	
}	

for(int j=common+1;j<=top1;j++){
cout<<s1[j].t->data<<endl;	
}
	
}
  

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值