描述:給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共節點(最近公共祖先節點可以為節點本身)
說明:所有節點的值都是唯一的。兩個節點為不同節點且存在於給定的二叉搜尋樹。
首先複習一下二叉搜尋樹的性質:
左子樹上所有節點的值都小於等於根節點的值
右子樹上所有節點的值都大於等於根節點的值
左子樹和右子樹也都是二叉搜尋樹
方法一:遞迴
從根節點開始遍歷樹
如果節點p和節點q都在右子樹上,那麼以右孩子為根節點繼續1的操作
如果節點p和節點q都在左子樹上,那麼以左孩子為根節點繼續1的操作
如果條件2和條件3都不成立,這意味著已經找到節點p和節點q的公共祖先了。
public treenode lowestcommonancestor(treenode root, treenode p, treenode q) else if (pval < parentval && qval < parentval) else
}
遞迴演算法是大家最熟悉的演算法,也是第一時間想到的解決辦法,下面介紹另外一種更加快捷方便的演算法。
方法二:清新腦迴路
由二叉搜尋樹的特性可以知道,如果兩個節點剛好位於左右子樹,那麼用根節點減去左子樹乘以根節點減去右子樹的乘積是小於等於0;所以由此特性可以寫出更巧妙的演算法:
public class lowestcommonancestor_235
private static void lca(treenode root, treenode p, treenode q) else if (root.val < p.val && root.val < q.val) else
}public static void main(string args)
}
以上就是該演算法的全部輸出,有木有乾貨滿滿的樣子。
LeetCode 二叉搜尋樹的最近公共祖先
給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉搜尋樹 root 6,2,8,0,4,7,9,null,null,3,5 示例 1 輸入 root 6,2,8,0,4,7,9,null,null,3,5 p 2,q 8 輸出 6 解釋 節點 2 和節點 8 的最近公共祖先...
LeetCode二叉搜尋樹的最近公共祖先C 版
給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉搜尋樹 root 6,2,8,0,4,7,9,null,null,3,5 示例 1 輸入 root 6,2,8,0,4,7,9,null,null,3,5 p 2,q 8 輸出 6 解釋 節點 2 和節點 8 的最近公共祖先...
leetcode 二叉搜尋樹的最近公共祖先
這裡的思路其實跟二叉樹找最近公共祖先一樣,唯一不同是二叉搜尋樹是已經有序的了。也就是左子樹一定會小於樹節點,右子樹一定會小於樹節點,所以我們可以直接判斷p q的位置,減少遍歷。public treenode lowestcommonancestor treenode root,treenode p,...