Leetcode每日打卡----20200927
文章目錄
1.二叉搜尋樹的最近公共祖先
給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。
百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x
的深度儘可能大(一個節點也可以是它自己的祖先)。”
示例 1:
輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
輸出: 6
解釋: 節點 2 和節點 8 的最近公共祖先是 6。
示例 2:
輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
輸出: 2
解釋: 節點 2 和節點 4 的最近公共祖先是 2, 因為根據定義最近公共祖先節點可以為節點本身。
說明:
所有節點的值都是唯一的。
p、q 為不同節點且均存在於給定的二叉搜尋樹中。
- 思路:利用二叉搜尋樹的性質,左<根<右
- 實現一:遞迴
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//二叉搜尋樹是根節點的左子樹的值< 根節點 < 右子樹的值
//利用這個性質,可以得出,如果pq的值都小於根節點的值,那麼說明他們都位於左子樹一邊
//否則為右子樹,如果一左一右那麼root就是公共祖先,遞迴實現
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == p || root == q || root == null){
return root;
}
if(p.val > root.val && q.val > root.val){
return lowestCommonAncestor(root.right, p, q);
}else if(p.val < root.val && q.val < root.val){
return lowestCommonAncestor(root.left, p, q);
}else{
return root;
}
}
}
- 實現二:一次遍歷,思路和上述一樣(二者的效率差不多)
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//遍歷
TreeNode ancestor = root;
while(true){
if(p.val < ancestor.val && q.val < ancestor.val){
ancestor = ancestor.left;
}else if(p.val > ancestor.val && q.val > ancestor.val){
ancestor = ancestor.right;
}else{
break;
}
}
return ancestor;
}
}
相關文章
- Leetcode每日打卡20201001-----迴文數LeetCode
- 每日打卡
- leetcode刷題.143. 重排連結串列.每日打卡LeetCode
- leetcode刷題.763. 劃分字母區間.每日打卡LeetCode
- 每日學習打卡
- 2024/4/23每日打卡
- 【10月打卡~Leetcode每日一題】18. 四數之和(難度:中等)LeetCode每日一題
- 【1月打卡~Leetcode每日一題】86. 分隔連結串列(難度:中等)LeetCode每日一題
- leetcode每日一題LeetCode每日一題
- 演算法每日學打卡:01-21打卡(解答後面整理)演算法
- Leetcode每日一題(1)LeetCode每日一題
- 每日LeetCode-day1LeetCode
- 每日leetcode——最長公共字首LeetCode
- 每日leetcode——155. 最小棧LeetCode
- 每日leetcode——42. 接雨水LeetCode
- 《Head First Java》20200927讀書筆記Java筆記
- LeetCode 2024/6 每日一題 合集LeetCode每日一題
- 每日leetcode——二分查詢LeetCode
- 打卡打卡
- LeetCode每日一題: 找不同(No.389)LeetCode每日一題
- LeetCode每日一題: 移除元素(No.27)LeetCode每日一題
- 每日leetcode——160. 相交連結串列LeetCode
- 每日leetcode——224.基本計算器LeetCode
- 每日一道Leetcode——上升下降字串LeetCode字串
- 從零打卡leetcode之day 1--兩數之和LeetCode
- 從零打卡leetcode之day 2---兩數相加LeetCode
- 從0打卡leetcode之day 3 -- 最大子序列和LeetCode
- LeetCode每日一題: 移動零(No.283)LeetCode每日一題
- LeetCode每日一題:迴文數(No.9)LeetCode每日一題
- LeetCode每日一題:兩數之和(No.1)LeetCode每日一題
- LeetCode每日一題:自除數(No.728)LeetCode每日一題
- LeetCode每日一題:Nim遊戲(No.292)LeetCode每日一題遊戲
- 每日一道 LeetCode (3):迴文數LeetCode
- 每日一道 LeetCode (1):兩數之和LeetCode
- 75. Sort Colors(Leetcode每日一題-2020.10.07)LeetCode每日一題
- LeetCode每日一題: 排列硬幣(No.441)LeetCode每日一題
- LeetCode每日一題: 各位相加(No.258)LeetCode每日一題
- LeetCode每日一題:求眾數(No.169)LeetCode每日一題