LeetCode 236. 二叉树的最近公共祖先(Lowest Common Ancestor of a Binary Tree)
2024-10-07 02:19:07
题目描述
给定一棵二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义: “对于有根树T的两个结点u、v,最近公共祖先表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。”(一个节点也可以是它自己的祖先)
_______3______
/ \
___5__ ___1__
/ \ / \
6 _2 0 8
/ \
7 4
例如,节点5
和节点1
的最近公共祖先是节点3
;节点5
和节点4
的最近公共祖先是节点5
,因为根据定义,一个节点可以是它自己的祖先。
解题思路
考虑用前序遍历的思想,从根节点开始对左右子树递归遍历,分别记录第一个在其左右子树中找到目的节点的节点,即为最近公共祖先的节点。若该子树中不包含目的节点,则返回NULL。具体步骤如下:
- 先判断该节点是否是要寻找的两个节点,如果是则返回目的节点;
- 判断是否为空节点,若是则返回NULL;
- 递归记录左右子树找到的最近公共祖先节点;
- 若在左右子树中找到了目的节点,则说明此节点为最近的公共祖先节点,返回此结点;
- 若找到的两节点中至少一个为空,则返回不为空的节点。注意这里可分为两种情况:
- 若两节点都为空,说明左右子树均未找到目的节点,返回NULL;
- 若只有一个节点为空,说明在左右子树中只找到了一个目的节点,返回找到的那个节点。对应题目中一个节点为祖先的情况,此情况中找到的那个节点即为公共祖先
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == p || root == q || root == NULL)
return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left && right)
return root;
return left == NULL ? right : left;
}
};
最新文章
- tomcat配置文件之Server.xml
- Delphi RichEdit操作
- unique mapped reads
- 【转】Linux 中断学习之小试牛刀篇
- CentOS 5.5安装图解教程
- C#串口扫描
- zabbix 安装配置以及漏洞检测脚本
- 一天搞定CSS:支持IE的Layout布局--16
- kvm之三:本地安装虚拟机
- C# this扩展方法
- 独立使用Asp.net Core 的razor模板 (一):Razor引擎的一些细节
- Android播放图片动画
- 伪类实现特殊图形,一个span加三角形
- Python全栈学习_day006作业
- 关于微信小程序如何解决多层循环嵌套
- GitLab 修改主机名,更换 IP 配置,配置 SMTP
- stl vector、红黑树、set、multiset、map、multimap、迭代器失效、哈希表(hash_table)、hashset、hashmap、unordered_map、list
- VMware Fusion 5虚拟机怎样与MAC共享文件
- Dubbo与Hadoop RPC的区别
- java 当读取的结果为-1时候说明已经读取结束了