LeetCode-235 lowest-common-ancestor-of-a-binary-search-tree 二叉搜尋樹的最近公共祖先
阿新 • • 發佈:2018-11-07
題目連結
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; } }