第1关:二叉树的最近公共祖先
任务描述
二叉树的最近公共祖先 指的是:对于二叉树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(约定一个结点也可以是它自己的祖先)
注意: 教材对祖先的定义是“从根到该结点所经分支上的所有结点”,但并不包括该结点本身。本任务约定一个结点也是它自己的祖先,这与教材是不一致的。在本任务中遵照题目的约定即可。
本关任务: 编写程序,对于给定的二叉树,找到该树中两个指定结点的最近公共祖先。
任务示例
测试数据说明
测试输入数据为2行,其中:
- 第1行为二叉树的先序遍历序列(用于创建二叉树)
- 第2行为指定的p、q结点的值
测试输出数据为1行,表示p、q的最近公共祖先的值
二叉树如下图所示:
示例1:
输入: CEF##BG##D##AI##H## E I 输出:C
示例2:
输入: CEF##BG##D##AI##H## E D 输出:E
开始你的任务吧,祝你成功!
c++代码答案:
//二叉树的最近公共祖先问题
#include<iostream>
using namespace std;
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
char ans=' ';//存放找到的最近公共祖先的值
//按先序次序输入二叉树中结点的值(字符),创建二叉链表表示的二叉树T
void CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if(ch=='#')
T=NULL;
else{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//在以T为根的二叉树中寻找p和q的最近公共祖先,返回ans
//ans为char类型全局变量,用于存放找到的最近公共祖先的值
BiTree lowestCommonAncestor(BiTree T,char p,char q) {
/*-----------------代码开始------------------*/
if(T==NULL)
return NULL;
if(T->data==p||T->data==q)
return T;
BiTree left=lowestCommonAncestor(T->lchild,p,q);
BiTree right=lowestCommonAncestor(T->rchild,p,q);
if(right!=NULL&&left!=NULL)
return T;
if(left==NULL&&right!=NULL)
return right;
else if(right==NULL&&left!=NULL)
return left;
else
return NULL;
/*-----------------代码结束------------------*/
}
//void preod(BiTree tree){
// if(tree==NULL)return;
// else{
//cout<<tree->data;
//preod(tree->lchild);
//preod(tree->rchild);
// }
//}
int main(){
BiTree tree;
CreateBiTree(tree);
// preod(tree);
char p,q;
cin>>p>>q;
BiTree t=lowestCommonAncestor(tree,p,q);
cout<<t->data;
return 0;
}
通过图片
解析推荐
推荐「leetcode」236. 二叉树的最近公共祖先【递归】详解! - 知乎 (zhihu.com)有图片好理解
易错点
//下面这样写是对的
// if(T==NULL)
// return NULL;
// if(T->data==p||T->data==q)
// return T;
//下面这样写是错的,头歌打印不出来
// if(T->data==p||T->data==q||T==NULL)
// return T;
//必须先判断非空与否