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; }