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

文章目录

题目要求

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

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

ACM

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

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
// #include <unordered_map>
// #include <algorithm>

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;   
}

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

TreeNode* p = new TreeNode(5);

运行结果

相关推荐
开开心心就好4 小时前
安卓手写文字生成工具,多种纸张一直免费
网络·网络协议·tcp/ip·leetcode·智能手机·电脑·模拟退火算法
All for pursuit.4 小时前
【栈-5】84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
AAA代码批发商4 小时前
Days 47 IMX6ULL 裸机开发:按键轮询实验 + 外部中断原理剖析(上)
笔记·学习·imx6ull·裸机开发·#arm中断
wzdark4 小时前
数据压缩算法的时间复杂度与压缩率权衡4
算法
sunoo-2295 小时前
【ARM嵌入式学习笔记Day6】一文打通i.MX6ULL时钟体系:PLL/PFD/预分频+滞回比较器全解析
arm开发·笔记·vscode·单片机·imx6ull·汇编语言
小陈phd5 小时前
深入理解agent学习笔记(一)——现代agent介绍
人工智能·算法
景煜拾年5 小时前
RHCA-Docker知识点整理
运维·笔记
圣保罗的大教堂5 小时前
leetcode 1665. 完成所有任务的最少初始能量 中等
leetcode
晴天的雨.9928 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
M78佐菲13 小时前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习