2017-3

/*
2020/4/16
第二遍
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct a
{
    char s1[20];
    char s2[20];
    char s3[20];
}input[100];

int N;
char str1[20];
char str2[20];

typedef struct node
{
    char name[20];
    int layer;
    node* parent;
    node* lchild;
    node* rchild;
}Node,*Tree;

Node* newNode(char name[])
{
    Node* temp = (Node*)malloc(sizeof(Node));
    strcpy(temp->name,name);
    temp->layer = 0;
    temp->parent = temp->lchild = temp->rchild = NULL;
    return temp;
}

void createTree(Node* root)
{
    int i;
    for(i = 0;i<N;i++)
        if(strcmp(root->name,input[i].s1) == 0)
            break;
    if(i == N) return ;

    Node* temp1 = newNode(input[i].s2);
    temp1->layer = root->layer + 1;
    temp1->parent = root;
    root->lchild = temp1;
    createTree(temp1);

    Node* temp2 = newNode(input[i].s3);
    temp2->layer = root->layer + 1;
    temp2->parent = root;
    root->rchild = temp2;
    createTree(temp2);
}

void preOrder(Node* root)
{
    if(root)
    {
        if(root->parent!=NULL)
        {
            printf("%s %d %s\n",root->name,root->layer,root->parent->name);
        }
        else
        {
            printf("%s %d\n",root->name,root->layer);
        }
        preOrder(root->lchild);
        preOrder(root->rchild);
    }
}

Node* findChildPosition(Node* root,char name[20])
{
    if(root == NULL) return NULL;

    if(strcmp(root->name,name) == 0)
        return root;

    Node* temp1 = findChildPosition(root->lchild,name);
    if(temp1) return temp1;

    Node* temp2 = findChildPosition(root->rchild,name);
    if(temp2) return temp2;

    return NULL;//通过左右子树都没有找到
}

//第一种方法求公共祖先节点
Node* LeastCommonAncient(Node* root,char name1[],char name2[])
{
    Node* temp1 = findChildPosition(root,name1);
    Node* temp2 = findChildPosition(root,name2);
    int layer1 = temp1->layer;
    int layer2 = temp2->layer;

    if(layer1 > layer2)
    {
        int c = layer1 - layer2;
        printf("%d\n",c);
        while(c--)
        {
            temp1 = temp1->parent;
        }
    }
    if(layer1 < layer2)
    {
        int d = layer2 - layer1;
        printf("%d\n",d);
        while(d--)
        {
            temp2 = temp2->parent;
        }
    }

    if(temp1 == temp2) return temp1;

    while(temp1->parent != temp2->parent)
    {
        temp1 = temp1->parent;
        temp2 = temp2->parent;
    }
    return temp1->parent;
}


int main()
{
    scanf("%d",&N);
    for(int i = 0;i<N;i++)
    {
        scanf("%s%s%s",input[i].s1,input[i].s2,input[i].s3);
    }
    scanf("%s%s",str1,str2);

    Node* root = newNode(input[0].s1);
    root->layer = 1;
    createTree(root);
    printf("%s\n",LeastCommonAncient(root,str1,str2)->name);
    return 0;
}

/*
IN:
4
Ye Shu Ba
Shu Ge Mei1
Ba Self Mei2
Ge Son1 Son2
Son2 Mei1
OUT:
1
Shu
*/
  • 注意:
//如果没有输入N怎么办?
	int N = 0
	while( scanf("%s%s%s",t1,t2,t3) == 3)
	{
		 strcpy(ssd[N].n1,t1);
		 strcpy(ssd[N].n2,t2);
		 strcpy(ssd[N].n3,t3);
		 N++;
	}
	strcpy(tmp1,t1);
	strcpy(tmp2,t2);
//如果给定的数据没有指定根节点,如何自己寻找?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct a
{
    char s1[20];
    char s2[20];
    char s3[20];
}input[100];

int N = 0;
char str1[20];
char str2[20];

typedef struct node
{
    char name[20];
    int layer;
    node* parent;
    node* lchild;
    node* rchild;
}Node,*Tree;

int main()
{
    char t1[20],t2[20],t3[20];
    N = 0;
    while(scanf("%s%s%s",t1,t2,t3) == 3)
    {
        strcpy(input[N].s1,t1);
        strcpy(input[N].s2,t2);
        strcpy(input[N].s3,t3);
        N++;
    }
    strcpy(str1,t1);
    strcpy(str2,t2);

    int i;
    /*
    for(i = 0;i<N;i++)
    {
        printf("%s %s %s\n",input[i].s1,input[i].s2,input[i].s3);
    }
    */
    char nameFather[20];
    strcpy(nameFather,input[0].s1);
    printf("%s\n",nameFather);
    i = 0;

    while(i != N)
    {
        if(strcmp(nameFather,input[i].s2) == 0)
        {
            strcpy(nameFather,input[i].s1);
            //printf("1 %s\n",nameFather);
            i = 0;
        }
        else if(strcmp(nameFather,input[i].s3) == 0)
        {
            strcpy(nameFather,input[i].s1);
            //printf("2 %s\n",nameFather);
            i = 0;
        }
        else
        {
            //printf("3 %d\n",i);
            i++;
        }
    }
    printf("%s\n",nameFather);
    return 0;
}
/*
IN:
Shu Ge Mei1
Ba Self Mei2
Ye Shu Ba
Ge Son1 Son2
Son2 Mei1
^Z
OUT:
Shu
Ye
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2017年第三季度的旅行对我来说是一个难忘的经历。 我选择了去泰国旅行,这是我人生中第一次去亚洲的国家。我的旅行目的是探索泰国独特的文化和美丽的风景。我计划了一个为期两周的行程,包括曼谷、清迈和普吉岛。 我首先到达了曼谷,这座充满活力和刺激的城市让我留下了深刻的印象。我参观了大皇宫、寺庙和夜市,品尝了当地的美食,并享受了舒适的泰式按摩。在曼谷的两天我感受到了泰国的繁华和独特魅力。 接下来,我前往清迈,在这个有着浓厚文化氛围的城市里,我参观了古老的寺庙、亲身体验了泰国传统手工艺品制作,并参加了传统的泼水节活动。我还去了清迈周边的乡村,骑大象和参观了瀑布。在清迈的日子里,我感受到了泰国传统文化的魅力以及友好的当地人民。 最后,我来到了普吉岛,这是一个被誉为天堂的海滨度假胜地。我在普吉岛度过了悠闲而放松的几天,享受了蓝天、白沙滩和清澈的海水。我还参加了一些水上活动,如潜水和划皮划艇。在普吉岛,我感受到了与大自然的亲密接触和平静。 总的来说,2017年第三季度的旅行是我人生中一段难忘的经历。我通过这次旅行更加了解了泰国的文化和美丽的风景。这次旅行给我留下了深刻的印象,并带给我许多美好的回忆。我期待着有机会再次回到泰国,继续探索这个神奇的国家。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值