基于二叉链表的二叉树的最近公共祖先问题
描述
在很多基于树的应用算法中,涉及到最近公共祖先问题(Least Common Ancestors,LCA)。对于有根树T的两个结点u、v,最近公共祖先LCA(u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。例如,对于下图所示的二叉树,LCA(C,F)=B,LCA(B,F)=B。
输入
多组数据。每组数据有两行,第一行为二叉树的先序遍历序列,其中左右子树若为空则用‘#’代替;第二行为两个待求最近公共祖先结点的两个结点u和v。当输入只有一个“0”时,输入结束。
输出
每组数据输出两行,第一行为该二叉树的中序遍历序列,第二行为u和v的最近公共祖先结点的值。
输入样例 1
ABC##DE#G##F### B F ABC##D##EF### C D 0
输出样例 1
CBEGDFA B CBDAFE B
示例一(大佬)
#include<iostream>
using namespace std;
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild,*root;
}BiNode,*BiTree;
void CreateBiTree(BiTree &T,char s[],int &i)
{
if(s[i]=='#')T=NULL;
else
{
T = new BiNode;
T->data=s[i];
CreateBiTree(T->lchild,s,++i);
CreateBiTree(T->rchild,s,++i);
}
}
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild);
cout<<T->data;
InOrder(T->rchild);
}
}
BiTree ancestor(BiTree T,char p,char q)
{
if(T==NULL)
return NULL;
if(T->data==p||T->data==q)
return T;
BiTree left=ancestor(T->lchild,p,q);
BiTree right=ancestor(T->rchild,p,q);
if(left==NULL)
return right;
if(right==NULL)
return left;
return T;
}
int main()
{
char s[100];
while(cin>>s&&s[0]!='0')
{
int i=-1;
BiTree T,T1;
CreateBiTree(T,s,++i);
char p,q;
cin>>p>>q;
T1=ancestor(T,p,q);
InOrder(T);
cout<<endl;
cout<<T1->data<<endl;
}
return 0;
}
示例二
#include<iostream>
using namespace std;
int sum=0;
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*Treelist;
void createtree(Treelist &T)
{
char ch;
cin>>ch;
if(ch=='#'||ch=='0')
T=NULL;
else
{
T=new BiTNode;
T->data=ch;
createtree(T->lchild);
createtree(T->rchild);
}
}
void show(Treelist &T)
{
if(T)
{
show(T->lchild);
cout<<T->data;
show(T->rchild);
}
}
int close(Treelist &T,char p,char q)
{
int l=0;
if(T==NULL)
return 0;
int left = close(T->lchild,p,q);
int right = close(T->rchild,p,q);
l = left+right;
if(T->data == p||T->data == q)
l++;
if(l =&