基于二叉链表的二叉树的最近公共祖先问题
描述
在很多基于树的应用算法中,涉及到最近公共祖先问题(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 == 2)
{
cout<<T->data<<endl;
return -1;
}
else if(l==3)
return -1;
else
return l;
}
int main()
{
while(1)
{
Treelist T;
createtree(T);
if(T==NULL)
break;
char p,q;
cin>>p>>q;
show(T);
cout<<endl;
close(T,p,q);
}
return 0;
}
三
#include<iostream>
using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}*BiTree;
void Create(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#'||ch=='0')
T=NULL;
else
{
T=new BiTNode;
T->data=ch;
Create(T->lchild);
Create(T->rchild);
}
}
void show(BiTree T)
{
if(T)
{
show(T->lchild);
cout<<T->data;
show(T->rchild);
}
}
BiTree zhuixun(BiTree T,char p,char q)
{
if(T==NULL)
return NULL;
if(T->data==p||T->data==q)
return T;
BiTree left=zhuixun(T->lchild,p,q);
BiTree right=zhuixun(T->rchild,p,q);
if(left==NULL)
return right;
if(right==NULL)
return left;
return T;
}
int main()
{
while(1)
{
BiTree T;
Create(T);
if(T==NULL)
break;
BiTree p,q;
q=new BiTNode;
p=new BiTNode;
BiTree T1;
cin>>p->data>>q->data;
T1=zhuixun(T,p->data,q->data);
show(T);
cout<<endl;
cout<<T1->data<<endl;
}
return 0;
}
四
#include<iostream>
using namespace std;
#define maxsize 1000
typedef struct BiTNode {
char data;
BiTNode* lchild, * rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{
if (S[i] == '#')
T = NULL;
else
{
T = new BiTNode;
T->data = S[i];
CreateBiTree(T->lchild, S, ++i);
CreateBiTree(T->rchild, S, ++i);
}
}
void PreOrderTraverse(BiTree& T) {
if(T==NULL)return ;
else ///时刻记住该节点是否为空
{
PreOrderTraverse(T->lchild);
cout << T->data;
PreOrderTraverse(T->rchild);
}
}
char find_s(BiTree& T,char node1, char node2)
{
if (T == NULL || node1 == NULL || node2 == NULL)
return NULL;
if (node1 == T->data||node2 ==T->data)
return T->data;
char cur = NULL;
char left_lca = find_s(T->lchild, node1, node2);
char right_lca = find_s(T->rchild, node1, node2);
if (left_lca && right_lca)
return T->data;
if (left_lca == NULL)
return right_lca;
else
return left_lca;
}
int main() {
while (1)
{
int i = 0;
char s[maxsize];
cin>>s;
if(s[0]=='0')break;
BiTree T;
CreateBiTree(T, s, i);
char ch0,ch1;
cin>>ch0>>ch1;
PreOrderTraverse(T);
cout<<endl;
cout<<find_s(T,ch0,ch1);
cout << endl;
}
return 0;
}
五、
#include<bits/stdc++.h>
using namespace std;
typedef struct BiTNode
{
char data;
BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void Int(BiTree &T)
{
char c;
cin>>c;
if(c == '#') T = NULL;
else
{
T = new BiTNode;
T->data = c;
Int(T->lchild);
Int(T->rchild);
}
}
void Int(BiTree &T,char c)
{
if(c == '0') T = NULL;
else if(c == '0') T = NULL;
else
{
T = new BiTNode;
T->data = c;
Int(T->lchild);
Int(T->rchild);
}
}
void Show(BiTree &T)
{
if(T)
{
Show(T->lchild);
cout<<T->data;
Show(T->rchild);
}
}
int Search(BiTree &T,char p,char q)
{
int l=0;
if(!T) return 0;
int m = Search(T->lchild,p,q);
int n = Search(T->rchild,p,q);
l = m+n;
if(T->data == p||T->data == q) l++;
if(l == 2) {cout<<T->data<<endl;return 100;}
else if(l==100) return 100;
else
return l;
}
int main()
{
BiTree T;
Int(T);
char i;
while(T)
{
char m,n;
cin>>m>>n;
Show(T);
cout<<endl;
Search(T,m,n);
cin>>i;
Int(T,i);
}
return 0;
}
六
#include<iostream>
using namespace std;
#define maxsize 1000
typedef struct BiTNode {
char data;
BiTNode* lchild, * rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree& T, char S[], int& i)
{
if (S[i] == '#')
T = NULL;
else
{
T = new BiTNode;
T->data = S[i];
CreateBiTree(T->lchild, S, ++i);
CreateBiTree(T->rchild, S, ++i);
}
}
void PreOrderTraverse(BiTree& T) {
if(T==NULL)return ;
else ///时刻记住该节点是否为空
{
PreOrderTraverse(T->lchild);
cout << T->data;
PreOrderTraverse(T->rchild);
}
}
char find_s(BiTree& T,char node1, char node2)
{
if (T == NULL || node1 == NULL || node2 == NULL)
return NULL;
if (node1 == T->data||node2 ==T->data)
return T->data;
char cur = NULL;
char left_lca = find_s(T->lchild, node1, node2);
char right_lca = find_s(T->rchild, node1, node2);
if (left_lca && right_lca)
return T->data;
if (left_lca == NULL)
return right_lca;
else
return left_lca;
}
int main() {
while (1)
{
int i = 0;
char s[maxsize];
cin>>s;
if(s[0]=='0')break;
BiTree T;
CreateBiTree(T, s, i);
char ch0,ch1;
cin>>ch0>>ch1;
PreOrderTraverse(T);
cout<<endl;
cout<<find_s(T,ch0,ch1);
cout << endl;
}
return 0;
}
七、
#include<iostream>
using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}*BiTree;
void Create(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#'||ch=='0')
T=NULL;
else
{
T=new BiTNode;
T->data=ch;
Create(T->lchild);
Create(T->rchild);
}
}
void show(BiTree T)
{
if(T)
{
show(T->lchild);
cout<<T->data;
show(T->rchild);
}
}
BiTree LCA(BiTree T,char x,char y)
{
if(T==NULL)
return NULL;
if(T->data==x||T->data==y)
return T;
BiTree left=LCA(T->lchild,x,y);
BiTree right=LCA(T->rchild,x,y);
if(left==NULL)
return right;
if(right==NULL)
return left;
return T;
}
int main()
{
while(1)
{
BiTree T;
Create(T);
if(T==NULL)
break;
BiTree m,n;
m=new BiTNode;
n=new BiTNode;
BiTree T1;
cin>>n->data>>m->data;
T1=LCA(T,m->data,n->data);
show(T);
cout<<endl;
cout<<T1->data<<endl;
}
return 0;
}
八、
#include<iostream>
using namespace std;
typedef struct BiTNode{
struct BiTNode *lchild,*rchild;
char data;
}BiTNode,*Bitree;
void CreateTree(Bitree &T,char ch[],int &i){
if(ch[i]=='#')
T=NULL;
else{
T=new BiTNode;
T->data=ch[i];
CreateTree(T->lchild,ch,++i);
CreateTree(T->rchild,ch,++i);
}
}
void midOrderTraverse(Bitree& T) {
if(T)
{
midOrderTraverse(T->lchild);
cout << T->data;
midOrderTraverse(T->rchild);
}
}
char find(Bitree& T,char a, char b)
{
if (T==NULL||a==NULL||b==NULL)
return NULL;
if (a==T->data||b==T->data)
return T->data;
char cur=NULL;
char left=find(T->lchild,a,b);
char right=find(T->rchild,a,b);
if(left&&right)
return T->data;
if (left==NULL)
return right;
else
return left;
}
int main(){
while(1){
char ch[1000];
cin>>ch;
if(ch[0]=='0')
break;
Bitree bt;
int i=-1;
CreateTree(bt,ch,++i);
midOrderTraverse(bt);//中序遍历
cout<<endl;
char a,b;
cin>>a>>b;
cout<<find(bt,a,b);
cout<<endl;
}
return 0;
}
九
#include<iostream>
using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void Create(BiTree &T,char S[],int &i)
{
if(S[i]=='#') T=NULL;
else
{
T=new BiTNode;
T->data=S[i];
Create(T->lchild,S,++i);
Create(T->rchild,S,++i);
}
}
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
char LSA(BiTree& T,char node1, char node2)
{
if(T==NULL||node1==NULL||node2==NULL) return NULL;
if(node1==T->data||node2==T->data) return T->data;
char cur=NULL;
char left_lca=LSA(T->lchild,node1,node2);
char right_lca=LSA(T->rchild,node1,node2);
if(left_lca&&right_lca) return T->data;
if(left_lca==NULL) return right_lca;
else return left_lca;
}
int main()
{
char S[1000];
while(cin>>S&&S[0]!='0')
{
int i=-1;
char ch1,ch2;
BiTree T;
Create(T,S,++i);
cin>>ch1>>ch2;
InOrderTraverse(T);
cout<<endl;
cout<<LSA(T,ch1,ch2);
cout<<endl;
}
return 0;
}
十、
#include<iostream>
using namespace std;
#define MAXSIZE 1000
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild,*root;
}BiNode,*BiTree;
void CreateBiTree(BiTree &T,char ch[],int &i)
{
if(ch[i]=='#')T=NULL;
else
{
T = new BiNode;
T->data=ch[i];
CreateBiTree(T->lchild,ch,++i);
CreateBiTree(T->rchild,ch,++i);
}
}
BiTree SeekBiTree(BiTree T,char t1,char t2)
{
if(T==NULL)
return NULL;
if(T->data==t1||T->data==t2)
return T;
if(T==NULL)
return NULL;
BiTree L=SeekBiTree(T->lchild,t1,t2);
BiTree R=SeekBiTree(T->rchild,t1,t2);
if(L==NULL)
return R;
if(R==NULL)
return L;
return T;
}
void InorderBiTree(BiTree T)
{
if(T)
{
InorderBiTree(T->lchild);
cout<<T->data;
InorderBiTree(T->rchild);
}
}
int main()
{
char ch[MAXSIZE];
cin>>ch;
while(ch[0]!='0')
{
char t1,t2;
int j=-1;
BiTree T,S;
CreateBiTree(T,ch,++j);
cin>>t1>>t2;
S=SeekBiTree(T,t1,t2);
InorderBiTree(T);
cout<<endl;
cout<<S->data<<endl;
cin>>ch;
}
return 0;
}