• LeetCode 236. 二叉树的最近公共祖先(Lowest Common Ancestor of a Binary Tree)


     

    题目描述

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

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

            _______3______
           /              
        ___5__          ___1__
       /              /      
       6      _2       0       8
             /  
             7   4
    

    例如,节点5和节点1的最近公共祖先是节点3;节点5和节点4的最近公共祖先是节点5,因为根据定义,一个节点可以是它自己的祖先。

    解题思路

    考虑用前序遍历的思想,从根节点开始对左右子树递归遍历,分别记录第一个在其左右子树中找到目的节点的节点,即为最近公共祖先的节点。若该子树中不包含目的节点,则返回NULL。具体步骤如下:

    • 先判断该节点是否是要寻找的两个节点,如果是则返回目的节点;
    • 判断是否为空节点,若是则返回NULL;
    • 递归记录左右子树找到的最近公共祖先节点;
    • 若在左右子树中找到了目的节点,则说明此节点为最近的公共祖先节点,返回此结点;
    • 若找到的两节点中至少一个为空,则返回不为空的节点。注意这里可分为两种情况:
      • 若两节点都为空,说明左右子树均未找到目的节点,返回NULL;
      • 若只有一个节点为空,说明在左右子树中只找到了一个目的节点,返回找到的那个节点。对应题目中一个节点为祖先的情况,此情况中找到的那个节点即为公共祖先

    代码

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    13         if(root == p || root == q || root == NULL)
    14             return root;
    15         TreeNode* left = lowestCommonAncestor(root->left, p, q);
    16         TreeNode* right = lowestCommonAncestor(root->right, p, q);
    17         if(left && right)
    18             return root;
    19         return left == NULL ? right : left;
    20     }
    21 };
  • 相关阅读:
    beta冲刺第一天
    反射机制
    Core Java 第五章总结
    Core Java 第四章总结
    Core Java 第三章总结
    第五讲附加总结
    高博SLAM基础课第五讲——PnP非线性优化
    高博SLAM基础课第五讲——几何基础
    高博SLAM基础课第四讲——非线性优化
    高博SLAM基础课第四讲——相机模型
  • 原文地址:https://www.cnblogs.com/wmx24/p/8981251.html
Copyright © 2020-2023  润新知