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

    Question:

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

    According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

            _______6______
           /              
        ___2__          ___8__
       /              /      
       0      _4       7       9
             /  
             3   5
    

    For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition。

    Analysis:

    问题描述:在一棵二叉搜索树中寻找两个节点的公共祖先(BST的特点是,左子树的所有节点的值小于根节点的值,右子树的所有节点的值大于根节点的值)。

    1)先排除特殊情况;

    2)如果根节点的值大于两个节点的最大值,则ancestor一定在左子树中,递归左子树;

    3)如果根节点的值小于两个节点的最小值,则ancestor一定在右子树中,递归右子树;

    4)否则,根节点与其中一个值相等或者大于左节点小于右节点,则结束递归,返回根节点。

    Answer:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
      public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
                if(root == null || p == null || q == null)
                    return null;
            // if(p == root || q == root) //如果一个是根节点,则根节点一定是最近common ancestor
            //         return root;
            if(root.val < Math.min(p.val, q.val)) //root比最小的都要小,说明在右边子树中
                    return lowestCommonAncestor(root.right, p, q);
            else if(root.val > Math.max(p.val, q.val)) //root比最大的都要大,说明在左边子树中
                    return lowestCommonAncestor(root.left, p, q);
            else return root;
        }
        
    }

    2)非递归方法判断(效率也没有很高啊。。)

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
      public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
                if(root == null || p == null || q == null)
                    return null;
            TreeNode t = root;
            while(true) {
                    if(t.val > p.val && t.val > q.val)
                        t = t.left;
                    else if(t.val < p.val && t.val < q.val)
                        t = t.right;
                    else
                        return t;
            }
        }
        
    }
  • 相关阅读:
    1. 第一章: Python基础语法
    6. 第二章:C#委托和事件之.net framework3.5委托扩展
    5. 第二章:C#委托和事件之事件
    4. 第二章:C#委托和事件之委托
    3. 第一章:C#面向对象编程之继承和多态
    2. 第一章:C#面向对象编程之抽象和封装
    1. 序言
    Xamarin.Forms 调用腾讯地图
    全国行政区划数据大放送——包含邮政编码-电话区号-简拼-区划路径
    【记录】自定义服务器验证控件
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/4823005.html
Copyright © 2011-2022 走看看