题目描述

给定一棵二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义: “对于有根树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;
}
};

最新文章

  1. tomcat配置文件之Server.xml
  2. Delphi RichEdit操作
  3. unique mapped reads
  4. 【转】Linux 中断学习之小试牛刀篇
  5. CentOS 5.5安装图解教程
  6. C#串口扫描
  7. zabbix 安装配置以及漏洞检测脚本
  8. 一天搞定CSS:支持IE的Layout布局--16
  9. kvm之三:本地安装虚拟机
  10. C# this扩展方法
  11. 独立使用Asp.net Core 的razor模板 (一):Razor引擎的一些细节
  12. Android播放图片动画
  13. 伪类实现特殊图形,一个span加三角形
  14. Python全栈学习_day006作业
  15. 关于微信小程序如何解决多层循环嵌套
  16. GitLab 修改主机名,更换 IP 配置,配置 SMTP
  17. stl vector、红黑树、set、multiset、map、multimap、迭代器失效、哈希表(hash_table)、hashset、hashmap、unordered_map、list
  18. VMware Fusion 5虚拟机怎样与MAC共享文件
  19. Dubbo与Hadoop RPC的区别
  20. java 当读取的结果为-1时候说明已经读取结束了

热门文章

  1. 客户端相关知识学习(五)之什么是webView
  2. java实现spark常用算子之groupbykey
  3. linux之信息查看
  4. 免费FQ工具
  5. oracle数据泵expdp和impdp使用
  6. jumpserver开源堡垒机部署安装
  7. Spark写入HBase(Bulk方式)
  8. 小米Air 13.3 安装Arch Linux
  9. Reflector破译
  10. C++的一些黑暗料理