基于二叉链表的二叉树的最近公共祖先问题

基于二叉链表的二叉树的最近公共祖先问题

描述

在很多基于树的应用算法中,涉及到最近公共祖先问题(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;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值