LeetCode -- 查找最小公共祖先

在一棵二叉树中, 查找两个节点的最近的公共祖先。
由于本题没有涉及到批量查询,因此考虑一般解法即可,如果涉及批量,可考虑Tarjan算法。

思路:
1. 先序遍历
2. 判断查找的两节点和当前节点的关系
3. 根据是否为空的情况返回不同节点

要注意的地方是判断节点是否相等,本题使用了C++语言,直接判断指针本身了

/**
 * 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 == NULL)
        return NULL;
    if(root== p || root==q)
        return root;  

    TreeNode* left = lowestCommonAncestor(root->left, p, q);
    TreeNode* right = lowestCommonAncestor(root->right, p, q);  

    if(left != NULL && right != NULL)
        return root;
    else if(left != NULL)
        return left;
    else if (right != NULL)
        return right;
    else
        return NULL;
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 05:45:05

LeetCode -- 查找最小公共祖先的相关文章

数据结构问题集锦 - 最小公共祖先问题

作为一个工程党,在各路竞赛大神的面前总会感到自己实力的捉急.大神总是能够根据问题的不同,轻而易举地给出问题的解法,然而我这种渣渣只能用所谓的”直观方法“聊以自慰,说多了都是泪啊.However,正视自己理论方面的不足,迎头赶上还是必要的,毕竟要真正踏入业界,理论知识是不能少的啊.(比如各种语言的Hash Map,它们的核心可都是红黑树啊) 既然助教要求博文要直观,通俗易懂,那就让我们递归这种方法开始.方法一:递归法 按照题目的要求,如果某两个节点具有同一个公共祖先的话,那么会存在两种情况:要么其

最小公共祖先lca

3.神秘国度的爱情故事 题目要求:某个太空神秘国度中有很多美丽的小村,从太空中可以想见,小村间有路相连,更精确一点说,任意两村之间有且仅有一条路径.小村 A 中有位年轻人爱上了自己村里的美丽姑娘.每天早晨,姑娘都会去小村 B 里的面包房工作,傍晚 6 点回到家.年轻人终于决定要向姑娘表白,他打算在小村 C 等着姑娘路过的时候把爱慕说出来.问题是,他不能确定小村 C 是否在小村 B 到小村 A 之间的路径上.你可以帮他解决这个问题吗? 输入要求:输入由若干组测试数据组成.每组数据的第 1 行包含一

最小公共祖先

对二叉查找树找到两个节点的最小公共祖先:可以根据二叉查找树的性质:左子树的节点值比根节点的值小,右子树的节点值比根节点值大 public class BinarySearchTree<T extends Comparable> { BinaryTreeNode<T> root; public BinarySearchTree(BinaryTreeNode<T> root) { this.root = root; } public BinaryTreeNode<T&

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

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

第4章第1节练习题11 查找最近公共祖先节点

问题描述 假设指针p和指针q分别指向二叉树中任意两个节点的指针,试编写算法找到p和q的最近公共祖先节点r 算法思想 因为计算的是公共祖先节点,因此可以考虑使用非递归后序遍历的思想.在非递归后序遍历的算法实现中,栈里面存放了即将入栈的元素的所有祖先节点. 为了方便表示说明,这里使用下图所描述的二叉树来说明. 假设指针p指向节点E,指针q指向节点G. 按照正常的非递归后序遍历算法进行遍历,即借助栈S完成: 当遍历到节点E时,将此时栈S中的元素复制到临时栈S1中.此时栈S1中的所有元素便为节点E的全部

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-

二叉树中两个结点最近的公共祖先汇总

一.若二叉树为搜索二叉树 原题链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/#/description Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on

最近公共祖先(LCA)问题

描述 对于有根树T的两个节点u和v,最近公共祖先LCA(T,u,v)表示一个节点x满足x是u,v的公共祖先且x的深度尽可能大. 算法 求解LCA问题主要有三种解法,分别是暴力搜索,Tanjar算法,最后一种是转化为RMQ问题,用DFS+ST算法来求解 暴力搜索 如果数据量不大的时候可以采用暴力搜索法.先将节点u的祖先节点全部标记出来,然后顺着节点v沿着父亲节点的方向向上遍历,直到遍历到一个被标记的节点,这个节点即为所求节点.或者分别获取u,v到根节点的路径P1,P2,可以将这两条路径看做两个两个

LCA(最近公共祖先)——离线 Tarjan 算法

一.梳理概念 定义:对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 通俗地讲,最近公共祖先节点,就是两个节点在这棵树上深度最大的公共的祖先节点,即两个点在这棵树上距离最近的公共祖先节点. 提示:父亲节点也是祖先节点,节点本身也是它的祖先节点. 给出一棵树,如图所示: 由上面的定义可知:3和5的最近公共祖先为1,5和6的最近公共祖先为2,2和7的最近公共祖先为2, 6和7的最近公共祖先为4. 二.繁文缛节 注意注意注意!!!尚