二叉树中两个节点的最短路径
步骤:求节点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;
}
}
运行结果: