Leetcode 236.二叉树的最近公共祖先

二叉树的最近公共祖先

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

百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。"

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

输出: 3

解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

输出: 5

解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉树中。

本题与LeetCode 235的区别就是由二叉查找树变为了二叉树,即数据从有序变为了无序,那么就不能通过root的值和两个节点的值的大小关系来划分查找区域。在题235的代码基础做了些许变动,同样使用递归搜索的方法,当root非空时,对root->left和root->right分别进行搜索。若搜索结果均非空,说明两个节点分别位于左右子树之中,LCA则为root;若只有一个结果为空,则LCA是另一个非空的节点;若结果均空,则返回NULL。

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
12         if(root==null||root==p||root==q) return root;
13         TreeNode left=lowestCommonAncestor(root.left,p,q);
14         TreeNode right=lowestCommonAncestor(root.right,p,q);
15         if(left!=null&&right!=null)
16             return root;
17         if(left==null)
18             return right;
19         if(right==null)
20             return left;
21         return null;
22     }
23 }

原文地址:https://www.cnblogs.com/kexinxin/p/10203100.html

时间: 2024-10-10 04:25:51

Leetcode 236.二叉树的最近公共祖先的相关文章

【LeetCode】二叉树的最近公共祖先(2)

(一)二叉搜索树的最近公共祖先 题目(Easy):235. 二叉搜索树的最近公共祖先 题目描述: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)." 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [6

236 二叉树的最近公共祖先

方法一.递归 class Solution { public: TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) { // root为空 if(root == nullptr || p == nullptr|| q == nullptr) { return nullptr; } // 如果p或者q为root(返回条件) if(root == p || root == q) { return root;

LeetCode236. 二叉树的最近公共祖先

* @lc app=leetcode.cn id=236 lang=cpp * * [236] 二叉树的最近公共祖先 * * https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/description/ * * algorithms * Medium (58.46%) * Likes:    300 * Dislikes: 0 * Total Accepted:    33.9K * Total Sub

LeetCode 235 BST的最近公共祖先

这个题目比一般二叉树的最近公共祖先更佳的具体化,因为左右遍历路径都可以提前确定. 由于BST TREE的特点 1.当p,q节点在root的不同子树上的时候,root就位根节点 2.p或者q就是root的时候,返回root 3.p,q同时在root的左子树或者右子树,那么就递归遍历左子树或者右子树 1 TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { 2 while( (root->val - p-

奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)

1. 二叉树最近公共祖先 奇安信集团 2020校招 服务端开发-应用开发方向在线考试 编程题|20分2/2 寻祖问宗 时间限制:C/C++语言 1000MS:其他语言 3000MS 内存限制:C/C++语言 65536KB:其他语言 589824KB 题目描述: 姓氏是人的符号标志,是家族血脉的传承:族谱是家族血脉传承的文字记载.同姓的两个中国人,根据族谱或许能够查出上面几代内是同一个祖先.查一下族谱,也许当代某位同姓名人就是你的远房亲戚,惊喜不惊喜,意外不意外!!! 输入 二元查找树(1.若左

编程算法 - 二叉树的最低公共祖先 代码(C)

二叉树的最低公共祖先 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉树的最低公共祖先(lowest common ancestor), 首先先序遍历找到两个结点的路径, 然后依据链表路径找到最低的公共祖先. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include

【剑指offer】【树】68-II.二叉树的最近公共祖先

二叉树的最近公共祖先 /** * 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* r

求二叉树的最低公共祖先

这个题目来讲,应该是在二叉树里面较为容易的题目了.那么如何下手呢?其实对于这样一棵二叉树来讲. 我们如何求它们的最低公共父节点呢? 假如是要你求5.6的公共父节点,那么是3.啰 为什么是3? 因为3的左子树是5,而右子树是6啰. 那么7.8的最低公共祖先呢? 1啊,因为1的左子树中有7.而1的右子树中有8啊. 那么思路来了.我们只要证明某一节点的左子树和右子树分别包含这两个节点就行了. 于是思路来了. 源代码: 注意:在本题中为了方便 ,我们传入的两个节点的值,而不是两个节的地址,呵呵,为了方便

二叉树的最小公共祖先问题

今天做了两个二叉树的题目, 挺简单的, 不用调试, 直接在提交框上敲完提交, 直接就通过了. 第一个题目是求二叉查找树的公共祖先, 因为是排序的, 所以很好做. 具体思路如下: 1 如果两个节点都比当前节点小, 那公共祖先必然是当前节点的左子树上, 所以递归左子树; 2 如果两个节点都比当前节点大, 那么同上, 递归右子树; 3 如果两个节点有一个为当前节点, 则当前节点为公共节点; 如果两个节点分别比当前节点小和大, 那么当前节点必为公共节点. 具体代码如下: class Solution {