• 【Leetcode笔记】236.二叉树的最近公共祖先


    题目要求

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

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
    在这里插入图片描述

    ACM

    本题适合从下往上遍历,所以使用后序遍历来递归。

    #include 
    #include 
    using namespace std;
    // #include 
    // #include 
    
    struct TreeNode
    {
        int val;
        TreeNode* left;
        TreeNode* right;
        TreeNode() : val(0), left(nullptr), right(nullptr) {}
        TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
        TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
    };
    
    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 == NULL) return right;
            if(right == NULL) return left;
            return root;
        }
    };
    
    int main(void)
    {
        TreeNode* root = new TreeNode(8);
        root->left = new TreeNode(10);
        root->right = new TreeNode(4);
        root->left->left = new TreeNode(1);
        root->left->right = new TreeNode(7);
        root->right->left = new TreeNode(15);
        root->right->right = new TreeNode(20);
        root->left->right->left = new TreeNode(6);
        root->left->right->right = new TreeNode(5);
        Solution solution;
    
        TreeNode* p = root->left->right->left;
        TreeNode* q = root->left->right->right;
        TreeNode* result = solution.lowestCommonAncestor(root, p, q);
        cout << "Lowest Common Ancestor: " << result->val << endl;
        return 0;   
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    测试代码中 p、q 的定义,不能简单地定义一个根节点,TreeNode* p = new TreeNode(6);

    TreeNode* p = new TreeNode(5);

    运行结果

    在这里插入图片描述

  • 相关阅读:
    机器学习的逻辑回归
    东芝第一代20T MAMR HDD实现PB级存储方案
    程序员喜欢Linux系统的原因有哪些?
    web share api 分享
    【OpenCV(3)】linux arm aarch 是 opencv 交叉编译与使用
    虹科方案|用Western Digital和ATTO技术优化SMR存储解决方案的负载
    剑指 Offer 34. 二叉树中和为某一值的路径
    面试笔试题之Linux部分58题(第一部分)
    C++ 模拟MIPS 反汇编与无流水线执行
    Bash脚本debug攻略
  • 原文地址:https://blog.csdn.net/qq_47607743/article/details/138070024