leetcode236. 二叉树的最近公共祖先

 

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

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

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

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

示例 1:

输入: root, p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3

示例 2:

输入: root, p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5因为根据定义最近公共祖先节点可以为指定节点自身。

解题思路:

递归搜索左右子树,如果左子树和右子树都不为空,说明最近父节点一定在根节点。

反之,如果左子树为空,说明两个节点一定在右子树;

同理如果右子树为空,说明两个节点一定在左子树。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL) return root;
        if(root==p||root==q) return root;
        TreeNode *left=lowestCommonAncestor(root->left,p,q);
        TreeNode *right=lowestCommonAncestor(root->right,p,q);
        
        if(left!=NULL&&right!=NULL) return root;//如果p,q刚好在左右两个子树上
        if(left==NULL) return right;//仅在右子树
        if(right==NULL) return left;//仅在左子树
    }
};

 

posted @ 2018-06-01 07:06  xzhws  阅读(34)  评论(0编辑  收藏  举报