Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

Given the following binary search tree:  root = [3,5,1,6,2,0,8,null,null,7,4]

     _______3______
/ \
___5__ ___1__
/ \ / \
6 _2 0 8
/ \
7 4

Example 1:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
Output: 3
Explanation: The LCA of of nodes 5 and 1 is 3.

Example 2:

Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
Output: 5
Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself
according to the LCA definition.

题意:

二叉树最近公共祖先

思路:

用自底向上(bottom-up)的思路,先看看是否能在root的左子树中找到pq,再看看能否在右子树中找到,

  • 如果两边都能找到,说明当前节点就是最近公共祖先
  • 如果左边没找到,则说明pq都在右子树
  • 如果右边没找到,则说明pq都在左子树

recursion

1.  search for either of two nodes(node1, node2) whose lca starting from root

2. any of the node is found,  return that node to its parent

3. any node gets a not null node from left side and a not null node from right side, it is lca. return that node to its parent

    ___5__                                             root 5
/ \ root.left / /return 6 root.right\ \ return 4
6 _2 6 find node1 2
/ \ root.left //return null \\ return 4
7 4 7 4 find 4 node1: 6 node2: 4

code

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode node1, TreeNode node2) {
// base
if (root == null || root == node1 || root == node2) {
return root;
}
// go into recursion on left side, passing same node1, node2
TreeNode left = lowestCommonAncestor(root.left, node1, node2);
TreeNode right = lowestCommonAncestor(root.right, node1, node2);
// left != null && right != null
if (left != null && right != null) {
return root; // such root is lca
}
// left!=null && right ==null
if (left != null) {
return left;
}
// right!=null && left == null
if (right!=null) {
return right;
}
// right ==null && left == null
return null;
}
}

最新文章

  1. HAProxy学习笔记
  2. Laxcus大数据管理系统单机集群版
  3. Socket网络编程(2)--服务端实现
  4. [原]hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)
  5. JavaIO(04)字符流--Writer and Reader
  6. Python系统调用——运行其他程序
  7. eclipse 好用的快捷键
  8. QT事件研究的文章
  9. HTML5 文件域+FileReader 读取文件并上传到服务器(三)
  10. Google的Guava工具类splitter和apache stringutil对比 编辑
  11. Django学习-3-请求流程
  12. [SQL]LeetCode184. 部门工资最高的员工 | Department Highest Salary
  13. 配置vscode同步大神玺哥的配置
  14. Python爬虫之多线程下载豆瓣Top250电影图片
  15. 控件屏蔽Ctrl+C 复制
  16. PHP----------用curl方式请求接口在同一个项目里面的时候不能请求的情况
  17. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十五):系统服务监控
  18. json等序列化模块 异常处理
  19. echart 3 数据密集时,断点不显示问题
  20. Linux文件系统_每一个的意义

热门文章

  1. PythonStudy——格式化输入小练习
  2. oracle存储结构
  3. windows下使用vscode编写运行以及调试C/C++
  4. npm i 出错
  5. centos7 下安装Docker CE
  6. C++Primer第五版——习题答案详解(十一)
  7. HTTPS如何保证数据传输的安全性 -- 结合加密
  8. 【Linux】【Jenkins】编译过程中遇到ERROR: Failed to parse POMs的解决方案
  9. Apollo配置中心
  10. leetcode560