zoukankan      html  css  js  c++  java
  • 【LeetCode-树】二叉搜索树的最近公共祖先

    题目描述

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

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

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

    示例:

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

    题目链接: https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/

    思路1

    使用和二叉树的最近公共祖先一样的方法。在 root 的左右子树中寻找 p 或者 q。在左子树中寻找的结果记为 left,在右子树寻找的结果记为 right。如果 left 为空,说明两个节点都在右子树当中:一个节点是右子树的根节点,另一个节点是右子树的子节点,返回 right。同理,如果 right 为空,则返回 left;如果 right 和 left 都不为空,则返回 root。代码如下:

    /**
     * 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==nullptr) return nullptr;
            if(p==q) return p;
            return search(root, p, q);
        }
    
        TreeNode* search(TreeNode* root, TreeNode* p, TreeNode* q){
            if(root==nullptr) return nullptr;
            if(root==p || root==q) return root;
    
            TreeNode* left = search(root->left, p, q);
            TreeNode* right = search(root->right, p, q);
            if(left==nullptr) return right;
            else if(right==nullptr) return left;
            else if(left!=right) return root;
            else return left;
        }
    };
    

    思路2

    思路 1 没有用到二叉搜索树这个条件。在二叉搜索树中,左子树的节点都小于根节点,右子树的节点都大于根节点。所以,我们判断 p、q 的值和 root 的值的关系:

    • 如果 p->val 和 q->val 都小于 root->val,则说明 p、q 都在 root 的左子树中,递归 root->left;
    • 如果 p->val 和 q->val 都大于 root->val,则说明 p、q 都在 root 的右子树中,递归 root->right;
    • 否则,说明 p 和 q 分别在 root 的左右子树,返回 root。

    代码如下:

    /**
     * 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(p->val<root->val && q->val<root->val){
                return lowestCommonAncestor(root->left, p, q);
            }else if(p->val>root->val && q->val>root->val){
                return lowestCommonAncestor(root->right, p, q);
            }else return root;
        }
    };
    
  • 相关阅读:
    flash中网页跳转总结
    as3自定义事件
    mouseChildren启示
    flash拖动条移出flash无法拖动
    需要一个策略文件,但在加载此媒体时未设置checkPolicyFile标志
    Teach Yourself SQL in 10 Minutes
    电子书本地转换软件 Calibre
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes – Page 31 练习
  • 原文地址:https://www.cnblogs.com/flix/p/13402537.html
Copyright © 2011-2022 走看看