Java二叉樹中LCA問題解決方法兩則
尋找公共祖先
給定一個二叉樹, 找到該樹中兩個指定節(jié)點(diǎn)的最近公共祖先。
百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節(jié)點(diǎn) p、q,最近公共祖先表示為一個節(jié)點(diǎn) x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節(jié)點(diǎn)也可以是它自己的祖先)。”

方法一-普通解法
思路:可以看作鏈表求交點(diǎn)的問題
首先需要找到到達(dá)兩個節(jié)點(diǎn)的路徑并用棧保存下來,然后讓他們在同一起點(diǎn),即路徑長的先釋放掉兩個路徑長的差值,然后兩個棧依次彈出棧頂元素,若相同,則是這兩個節(jié)點(diǎn)的公共祖先 。比較難的是怎樣找到到達(dá)節(jié)點(diǎn)的路徑,定義一個棧,從根節(jié)點(diǎn)開始遍歷,棧先存儲根節(jié)點(diǎn),然后判斷是否等于要找的節(jié)點(diǎn),不等于則繼遍歷根節(jié)點(diǎn)的左右子樹,左右子樹又是新的根節(jié)點(diǎn),如果左右子樹不為要找的節(jié)點(diǎn),則遍歷他們的子樹,還是找不到,則出棧,即這個節(jié)點(diǎn)不在要找的節(jié)點(diǎn)的路徑里
代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || p == null || q== null){
return null;
}
Stack<TreeNode> stack1 = new Stack<>();
getPath(root,p,stack1);
Stack<TreeNode> stack2 = new Stack<>();
getPath(root,q,stack2);
int size1 = stack1.size();
int size2 = stack2.size();
int size = 0;
if(size1 > size2){
size = size1 - size2;
while(size>0){
stack1.pop();
size--;
}
}
else{
size = size2 - size1;
while(size>0){
stack2.pop();
size--;
}
}
//起點(diǎn)已經(jīng)相同
while(stack1.peek() != stack2.peek()){
stack2.pop();
stack1.pop();
}
return stack1.peek();
}
public boolean getPath(TreeNode root,TreeNode node,Stack<TreeNode> stack){
if(root == null || node == null){
return false;
}
stack.push(root);
if(root == node){
return true;
}
boolean flag1 = getPath(root.left,node,stack);
if(flag1 == true){
return true;
}
boolean flag2 = getPath(root.right,node,stack);
if(flag2 == true){
return true;
}
stack.pop();
return false;
}
}方法二-子問題

pq的分布為以上三種情況,pq為root時,就是公共祖先,若不是這種情況,則遞歸調(diào)用尋找root的左右子樹節(jié)點(diǎn)是否有p或q。pq分布在root左右兩側(cè)時,root就是公共祖先,pq分布在單側(cè)時,先找到的即為兩個節(jié)點(diǎn)的公共祖先。子問題體現(xiàn)在尋找pq時,每個子樹都會調(diào)用函數(shù)
代碼
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null ){
return null;
}
if(root == p || root == q){
return root;
}
TreeNode leftT = lowestCommonAncestor(root.left,p,q);
TreeNode rightT = lowestCommonAncestor(root.right,p,q);
if(leftT != null && rightT != null){
return root;
}
else if(leftT != null){
return leftT;
}
else if(rightT != null){
return rightT;
}
else{
return null;
}
}
}到此這篇關(guān)于Java二叉樹中LCA問題解決方法兩則的文章就介紹到這了,更多相關(guān)Java二叉樹中LCA問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法
這篇文章主要介紹了idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
java實(shí)現(xiàn)簡易外賣訂餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡易外賣訂餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
nacos一直頻繁的打印日志get changegroupkeys問題
這篇文章主要介紹了nacos一直頻繁的打印日志get changegroupkeys問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
使用maven對springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案
springboot項(xiàng)目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個插件默認(rèn)情況下,會把所有的依賴包全部壓縮到一個jar里面,今天給大家分享幾種方案來如何減小我們的打包文件,需要的朋友可以參考下2024-02-02
JNI實(shí)現(xiàn)最簡單的JAVA調(diào)用C/C++代碼
這篇文章主要介紹了JNI實(shí)現(xiàn)最簡單的JAVA調(diào)用C/C++代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
SpringBoot如何設(shè)置404、500返回統(tǒng)一格式j(luò)son
這篇文章主要介紹了SpringBoot如何設(shè)置404、500返回統(tǒng)一格式j(luò)son問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Mybatis 級聯(lián)刪除的實(shí)現(xiàn)
這篇文章主要介紹了Mybatis 級聯(lián)刪除的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
SpringBoot使用自動配置xxxAutoConfiguration
這篇文章介紹了SpringBoot自動配置xxxAutoConfiguration的使用方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

