1265 最近公共祖先

1265 最近公共祖先

  • 描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
    最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

  • 输入:输入两行。
    第一行按照先序输入一棵二叉树,其中空节点用 -1 表示。
    第二行输入两个结点的值val1, val2 , 输出该结点的双亲节点的val.(数据保证所有节点val的值都不相同)

  • 输出:输出一行,代表最近公共祖先的val。

  • 输入示例

    3 5 6 -1 -1 2 7 -1 -1 4 -1 -1 1 0 -1 -1 8 -1 -1
    5 1
    
  • 输出示例

    3
    
  • 代码块

    #include<bits/stdc++.h>
    using namespace std;
    typedef struct Node{
        int data;
        Node *lchild, *rchild;
    }BiTNode, *BiTree;
    
    BiTree Build(){
        int data;
        scanf(" %d", &data);
        if(data == -1) return NULL;
        BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode));
        p->data = data;
        p->lchild = Build();
        p->rchild = Build();
        return p;
    }
    
    BiTNode *p = NULL;
    
    //还是递归思想
    bool Find(BiTree T, int a, int b){
        if(T == NULL) return false;
        if(T->data == a || T->data == b) {
        	//一个节点也可以是它自己的祖先,一下三行代码就是对此做出判断
            bool l = Find(T->lchild, a, b);
            bool r = Find(T->rchild, a, b);
            if(l || r) p = T;
            return true;//找到一个结点就返回true
        }
        bool l = Find(T->lchild, a, b);
        bool r = Find(T->rchild, a, b);
        if(l && r) p = T;
        if((l || r) && (T->data == a || T->data == b)) p = T;//一般情况,两个结点都是某个结点的子孙结点
        return l || r;
    }
    
    int main(){
        BiTree T = Build();
        int a, b;
        scanf(" %d %d", &a, &b);
        Find(T, a, b);
        printf("%d\n", p->data);       
        system("pause");
        return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值