[力扣题解] 236. 二叉树的最近公共祖先

文章目录

题目:236. 二叉树的最近公共祖先

思路

代码

MyMethod

用深度搜索的思想(好吧,前序、中序、后序都是深搜思想),保存寻找路径,看看找到2个节点的路径的重合部分,就可以找到最近公共祖先;

该方法实际上不需要遍历整棵树;

cpp 复制代码
class Solution {
public:
    vector<TreeNode*> path;
    vector<vector<TreeNode*>> result;
    void travel(TreeNode* cur, TreeNode* target)
    {   
        if(cur == NULL)
        {
            return;
        }
        // 中
        if(cur->val == target->val)
        {
            result.push_back(path);
            return;
        }
        // 左
        if(cur->left)
        {
            path.push_back(cur->left);
            travel(cur->left, target);
            path.pop_back();
        }
        // 右
        if(cur->right)
        {
            path.push_back(cur->right);
            travel(cur->right, target);
            path.pop_back();
        }
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
    {
        int i, j, min_length;
        path.push_back(root);
        travel(root, q);
        path.clear();
        path.push_back(root);
        
        travel(root, p);
        /*
        for(i = 0; i < result.size(); i++)
        {
            for(j = 0; j < result[i].size(); j++)
            {
                cout << result[i][j]->val << ", ";
            }
            cout << endl;
        }*/
        // cout << "result[0].size() : " << result[0].size() << endl;
        // cout << "result[1].size() : " << result[1].size() << endl;
        min_length = min(result[0].size(), result[1].size());
        for(i = 0; i < min_length; i++)
        {
            if(result[0][i]->val == result[1][i]->val)
            {
                continue;
            }
            else
            {
                break;
            }
        }
        // cout << "i : " << i << "result[0][i] : " << result[0][i]->val;
        return result[0][i-1];
    }
};

Method 2

后序遍历,左、右、中。中间节点处理左右子树有没有找到孩子。

后序遍历很恰当的模拟了回溯的过程,需要遍历整棵树;

cpp 复制代码
class Solution {
public:
    TreeNode* travel(TreeNode* cur, TreeNode* p, TreeNode* q)
    {
        if(cur == p || cur == q || cur == NULL)
        {
            return cur;
        }
        // 左
        TreeNode* left = travel(cur->left, p, q);
        // 右
        TreeNode* right = travel(cur->right, p, q);
        // 中
        if(left && right) // 找到了
        {
            return cur;
        }
        else if(left && right == NULL)
        {
            return left;
        }
        else // (left == NULL && right)
        {
            return right;
        }

    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        return travel(root, p, q);
    }
};
相关推荐
nlpming8 分钟前
opencode SQLite 数据库结构与查询手册
算法
Cando学算法12 分钟前
中位数定理:到所有点的距离之和最小的点就是中位数
c++·算法·学习方法
nlpming13 分钟前
opencode 上下文压缩(Compaction)机制
算法
anew___15 分钟前
算法刷题避坑指南:从数据规模到易错点的实战总结
算法
HZY1618yzh21 分钟前
洛谷题解:P16304 [蓝桥杯 2026 省 Java C 组] 抽奖活动
java·c++·算法·蓝桥杯
智者知已应修善业34 分钟前
【51单片机从奇数始再转偶数逐一点亮并循环】2023-9-8
c++·经验分享·笔记·算法·51单片机
倔强的猴子(翻版)40 分钟前
我用 Python 写了个排序库,一亿数据量下比 C 级 np.sort() 快 7 倍
人工智能·python·算法·阿里云·文心一言
郝学胜-神的一滴42 分钟前
深入理解回归损失函数:MSE、L1 与 Smooth L1 的设计哲学
人工智能·python·程序人生·算法·机器学习·数据挖掘·回归
iCxhust1 小时前
在 emu8086 中可以直接编译运行的完整汇编程序,演示数组的定义、遍历、求和、求最大值。
开发语言·前端·javascript·汇编·单片机·嵌入式硬件·算法
Jinkxs1 小时前
LoadBalancer- 常见负载均衡算法:轮询 / 加权轮询 / 最少连接等基础实现
运维·算法·负载均衡