剑指 Offer 68 - II. 二叉树的最近公共祖先 && Leetcode 236. 二叉树的最近公共祖先

地址  https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/

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

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

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

复制代码
示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
 

说明:

所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
注意:本题与主站 236 题相同:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
复制代码

 解答 同样是树的遍历

但是二叉树要比二叉搜索书更加复杂

因为不能依据搜索节点的值与当前节点比较而判断搜索节点是在当前节点的左子树或者右子树或者一边一个节点

我们只能两边子树均进行搜索比对

添加一个变量num  记录左子树和右子树出现搜索节点的数目

类似上一题,搜索节点和当前节点的相对位置可以分为以下几种情况

1 两搜索点均在当前节点两边,当前节点就是答案

2 两搜索点在当前节点同一边,因为不同于二叉树,我们要遍历完当前节点的所有子树后才能确认搜索点的位置,

所以是在回溯的时候确认两搜索点在当前节点同一边,这时候应该已经得到了答案。不予处理  .

3 当前节点就是搜索节点,如果另一节点已经搜索到 返回当前节点

复制代码
class Solution {
public:
    TreeNode* ans = NULL;
    int dfs(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == NULL) return 0;
        
        int lfind = dfs(root->left, p, q);
        int rfind = dfs(root->right, p, q);
        
        int ret = lfind + rfind;
        if (p->val == root->val ||q->val == root->val ) ret++;
        if (ret == 2 && ans == NULL) { ans = root; }
        return ret ;
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        dfs(root, p, q);
        return ans;
    }
};
复制代码

 

posted on   itdef  阅读(82)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2018-03-06 asio的网络通讯代码练手
2016-03-06 深入应用c++11 随书代码

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示