zoukankan      html  css  js  c++  java
  • 235.Lowest Common Ancestor of a Binary Search Tree


    给定一个二叉搜索树,以及2个节点p, q ,求这两个节点的最近公共祖先。

    Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
    Output: 6
    Explanation: The LCA of nodes 2 and 8 is 6.

    Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
    Output: 2
    Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

    思路:
    一、因为是二叉搜索树,所以中序遍历是已经排好序的如果p, q的值都比根节点小,则最近祖先节点在根节点左边,反之,在根节点右边;如果其中一个比根节点小,另一个比根节点大,则根节点就是最近祖先。对于其中一个节点的值等于根节点,则根节点也是最近祖先。题目说了一定存在最近祖先,所以不用考虑节点为空、不存在的情况。

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root->val == p->val || root->val == q->val) return root;
        if (root->val > p->val && root->val < q->val) return root; //  p < root < q
        if (root->val > q->val && root->val < p->val) return root; //  q < root < p
        if (root->val > p->val && root->val > q->val) return lowestCommonAncestor(root->left, p, q);
        return lowestCommonAncestor(root->right, p, q);
    }

    二、如果不考虑二叉搜索树,将二叉树当作无序的普通二叉树。
    则,当前节点与其中任意一个节点相等时,返回当前节点。
    当前节点的左子树搜索有返回结果,且右子树搜索也有返回结果,则当前节点就是最近公共祖先,返回当前节点。
    当前节点的一边子树搜索有结果,而另一边返回为null,返回有结果的子树上返回的结果,所以,需要一个变量来保存子树搜索的结果
    如果都为左右子树搜索结果都为null,返回null.

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root) return NULL;
        if (root == p || root == q) return root;
        TreeNode* left_res = lowestCommonAncestor(root->left, p, q);
        TreeNode* right_res = lowestCommonAncestor(root->right, p, q);
        if (left_res && right_res) return root;
        return left_res ? left_res : right_res;
    }

    Java 版:

    class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if(p.val > q.val){
                TreeNode tmp = p;
                p = q;
                q = tmp;
            }
            if(p.val <= root.val && q.val >= root.val) return root;
            if(p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p,q);
            return lowestCommonAncestor(root.right, p,q);
        }
    }
  • 相关阅读:
    Java的错误类型
    交换两个变量的值
    变量的自增、自减、自乘、自除运算
    通过Scanner从控制台获取数据
    通过args数组获取数据
    int类型与char类型的转换
    大类型向小类型转换
    小类型向大类型转换
    6 高级2 自连接 视图
    5 高级 关系 连接
  • 原文地址:https://www.cnblogs.com/luo-c/p/12878479.html
Copyright © 2011-2022 走看看