1. 程式人生 > >LeetCode-235 lowest-common-ancestor-of-a-binary-search-tree 二叉搜尋樹的最近公共祖先

LeetCode-235 lowest-common-ancestor-of-a-binary-search-tree 二叉搜尋樹的最近公共祖先

題目連結

LeetCode-235 lowest-common-ancestor-of-a-binary-search-tree

題意

中文題,注意,題目要求是“二叉搜尋樹”,這就大大化簡題目難度了。

題解

        比較簡單了,因為資料結構給的是二叉搜尋樹。剛開始沒看清,還以為要用lca來寫,因為返回的是一個結點,所以還在糾結如何構造時間戳陣列。後來感覺題目標明的是簡單題不能用lca來寫吧= =才發現是二叉搜尋樹。

        二叉搜尋樹的重要性質:模擬了二分搜尋,左子樹<根<右子樹。那麼,要搜尋的兩個點是確定的,那麼任意的父結點對於這兩個節點而言只有三種情況:全在父結點的左子樹上、全在父結點的右子樹上、分別在兩側。並且,在兩側的情況是唯一的。而這個唯一的情況就是最近公共祖先。

        那麼碰到其他兩種情況,就分別向一側進行搜尋,直到碰見唯一情況就可以了。判定是否唯一有一種比較簡單的數學方法,即父結點與兩個節點分別求差,在相乘。因為一大一小,得到的值一定是負值。而其他兩種情況一種全為正一種全為負,乘積一定是大於0。

Java 程式碼

class Solution {
    public static TreeNode ans = null;
    
    public static int Max(int a,int b){
        return a > b ? a : b;
    }
    
    public static void lca(TreeNode root,TreeNode p,TreeNode q){
        if((root.val - p.val) * (root.val - q.val) <= 0){
            ans = root;
        }else{
            if(Max(p.val,q.val) < root.val){
                lca(root.left,p,q);
            }else{
                lca(root.right,p,q);
            }
        }
    }
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        lca(root,p,q);
        return ans;
    }
}