支线任务-4

Lowest Common Ancestor of a Binary Tree



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 v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

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

For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.



按照题目的说法,这就是一个LCA(最小公共祖先)的裸题。可以算是经典题目了。

抛开那些套路般的算法(下面会详细介绍)模板,这个题目也是可以做的。注意到它只是进行了一次询问,所以会比较好考虑。

注意到这样几点(假设所求节点为pq):

  • 如果节点nodepq的LCA的话,node的所有祖先都会是pq的公共祖先
  • 对于节点pq来说,设他们的LCA为r,则要么pq其中一个为r,要么他们分别处于r的左子树和右子树。

所以如果采用DFS(后序遍历)的搜索方式,一旦判断到某个节点符合上面第二条的性质,那么就能马上肯定这个节点就是所求LCA。复杂度不难分析,O(N)

对应代码如下:

/**
 * 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 *pp = NULL;
    TreeNode *qq = NULL;
    TreeNode *lca = NULL;

    void dfs(TreeNode *root, TreeNode *p, TreeNode *q)
    {
        if (lca != NULL) return;
        if (root->left != NULL)
        {
            dfs(root->left, p, q);
            if (pp == root->left) pp = root;
            if (qq == root->left) qq = root;
        }
        if (root->right != NULL)
        {
            dfs(root->right, p, q);
            if (pp == root->right) pp = root;
            if (qq == root->right) qq = root;
        }
        if (lca != NULL) return;
        if (root == p)    pp = root;
        if (root == q)    qq = root;
        if (pp != NULL && qq != NULL && pp == qq) lca = root;
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        dfs(root, p, q);
        return lca;
    }
};
时间: 2024-10-06 00:55:47

支线任务-4的相关文章

支线任务8-Find Median from Data Stream(中位数问题)

一.题目描述 Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value. Examples: [2,3,4] , the median is 3 [2,3], the median is (2 + 3) / 2 = 2.5 Des

数据结构与算法(1)支线任务4——Lowest Common Ancestor of a Binary Tree

题目如下:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/ 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 def

支线任务8——寻找中位数

题目描述 用以下的一个类实现两个函数 void addNum(int num) - Add a integer number from the data stream to the data structure. double findMedian() - Return the median of all elements so far. class MedianFinder { public: // Adds a number into the data structure. void add

数据结构与算法(1)支线任务8——Find Median from Data Stream

题目如下:(https://leetcode.com/problems/find-median-from-data-stream/) Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value. Examples: [2,3,4] 

支线任务5

题目:The Skyline Problem A city's skyline is the outer contour of the silhouette formed by all the buildings in that city when viewed from a distance. Now suppose you are given the locations and height of all the buildings as shown on a cityscape photo

支线任务-3

Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. 大概形如上图所示.5,6构成的就是所求的最大矩形区域.题目简单暴力. 开始先写个朴素的O(N^2)算法,发现果然过不了...

支线任务2-Basic Calculator

问题描述: 题目要求我们实现一个简单的加减计算器,计算一个表达式的值,表达式除了数字之外还可能会含有括号,加减符号以及空格. 思路: 其实看到这个题自然就会想到利用后缀式求表达式值的算法作业题,况且这个题还没有乘法除法运算,我就沿用了做算法作业题的思路来求解: 1.由原表达式求出后缀式 2.根据后缀式求值 当然,这个题由于没有乘除法,不需要考虑运算符的优先性而只需要考虑括号的分隔作用,相比于算法作业有很多地方可以简化:比如新的一个运算符号遇到栈顶符号时可以直接拿出栈顶符号,又比如在栈里在'('之

支线任务-Python爬虫

五一小长假要到了,甄开心,肯定比写博客要开心多了,哈哈哈哈 我还在犹豫要不要写爬虫这篇,因为网上已经有大量爬虫相关资源,爬虫也不是以研究为主,而是一个获取数据的手段. 书写目的: 数据数量和质量对你运行模型的效果有着重要影响: 如果数据购买昂贵又没有现成数据下载,不论个人还是公司都会首选爬虫: 不需要深入爬虫知识(比如Scrapy爬虫工程),就可以获取大部分网站数据: 装包提示: 装包用pip install XXX,Baidu一下有很多指导帖 学会Baidu谷歌能够让你在之后的路上走得更远更自

编程入门指南

前言 如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容:作为创业者,技术创始人的身份则会让你的很多工作显得更容易.而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始:入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步:你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目:你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么. 这篇文章的内容对此不仅会有一些方向性的建议,