zoukankan      html  css  js  c++  java
  • 剑指 Offer 68

    地址  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;
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    某个虚拟机卡死时,单独关闭卡死虚拟机的方法
    VMWare虚拟机启动不了有个叉叉的解决办法
    IDEA如何将git下来的是工程转为maven工程
    Git的使用及安装
    教你一招避开网盘限速(百度网盘下载助手)
    idea编写第一个springboot程序
    解决IDEA Initialization error 'https://start.spring.io'
    从1G到5G发展史(3GPP是个什么组织 为啥5G标准离不开它)
    idea万能快捷键,你不知道的17个实用技巧!!!
    MySQL下载安装详情教程
  • 原文地址:https://www.cnblogs.com/itdef/p/14490376.html
Copyright © 2011-2022 走看看