根據236的做法,這個就簡單了。
遞歸主要費時間的地方是,分別去左右子樹去找,有沒有p和q。
利用搜索樹的性質,減少遞歸的次數
如果p和q都小於root,去左邊找就行。
如果p和q在兩側的,直接就是root,這個可以通過val來判斷。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //返回條件一樣 //如果往下的過程中,先遇到p或者q,它就是最近祖先 if(root==null||root==p||root==q) return root; //都在左邊,那p和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 { //val一個大於一個小於,直接就是自己的 return root; } }