給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸出: 3
解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。
示例 2:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。因為根據定義最近公共祖先節點可以為節點本身。
思路: lca問題與二叉搜尋樹的最近公共祖先不同,此題左右節點大小沒有固定關係.
eg : lca(3,1) = 3 //其中乙個節點與3相等 }lca(1,3) = 3 //其中乙個節點與3相等 }
lca(5,8) = 3 //分部在3的左右子樹中 } 我們可以發現,只要 (乙個在3的左邊,乙個在3的右邊)||(其中乙個節點的值與root相等) ,lca的值都為3
lca(6,8) = 3 //分布在3的左右子樹 }
lca(8,7) = 3 //分布在3的左右子樹中 }
lca(6,4) = 5 //分布在5的左右子樹中 } 當root為5時,與上一情況相同(乙個在左乙個在右)||(其中乙個節點的值與root相同)
lca(5,2) = 5 //其中乙個節點與5相等 }
對搜尋規則進行介紹:目的: 以某個節點為根結點,如果兩個問題節點分別在此根結點的左右兩側或其中乙個問題節點與這個節點相等,那麼這個節點就是解.如果兩個問題節點都分布在根結點的一端,那麼這個節點就不是解,但是這一端中包含著問題的解,而另一端則不含解
1) 對於root節點: 如果root為空節點,返回null如果root與p或q相等,返回p或q.
2) 如果沒有在情況1返回,說明root不為空並且不與p,q相等
那麼,可能節點的分布存在以下情況:
一:節點乙個分布在root的左子樹乙個分布在root的右子樹
二:節點都分布在root的左子樹
三:節點都分布在root的右子樹
我們對左右節點分別進行遞迴.左右節點分別成為新root節點.(記為新root節點)
3) 那麼,左右兩個搜尋方法的返回值 searchleft和searchright 也根據搜尋有了不同的情況
一: searchleft 和 searchright 都不為空,對應著情況一
二: searchleft不為空,searchright為空 , 對應著情況二
三: searchright不為空,searchleft為空 , 對應著情況三
1class
solution236
7 treenode searchleft =lowestcommonancestor(root.left, p, q);
8 treenode searchright =lowestcommonancestor(root.right, p, q);910
if (searchleft != null && searchright != null)
13if (searchleft != null)
16return
searchright;
1718
}19 }
二叉樹LCA leetcode236題
輸入 root 3 5,1 6,2 0,8 null null,7 4 p 5,q 1輸出 3解釋 節點 5 和節點 1 的最近公共祖先是節點 3。1.雜湊表解法 1 建立佇列queue進行二叉樹層序遍歷 2 設定map對映父子結點關係,從而可以從子結點訪問到父節點 3 利用map記錄的聯絡找出p所...
LeetCode236 二叉樹最近祖先
思考 這個函式就是查詢p,q兩個節點的祖先,然後給了這棵樹的root,1 它先進行判斷,根節點是不是null 或者根節點是否是p q,要是有乙個是,那祖先就肯定是root 2 它用了遞迴的思想去查詢左右兩個子樹,因為pq的祖先要麼在左邊,要麼就在右邊,所以肯定能找到乙個祖先。3 若找到的left 子...
LeetCode第98題(驗證二叉搜尋樹)
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true 示例 2 輸入 5 1 4 3 6 輸出 false 解釋 ...