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

方法一-普通解法
思路:可以看作鏈表求交點(diǎn)的問(wèn)題
首先需要找到到達(dá)兩個(gè)節(jié)點(diǎn)的路徑并用棧保存下來(lái),然后讓他們?cè)谕黄瘘c(diǎn),即路徑長(zhǎng)的先釋放掉兩個(gè)路徑長(zhǎng)的差值,然后兩個(gè)棧依次彈出棧頂元素,若相同,則是這兩個(gè)節(jié)點(diǎn)的公共祖先 。比較難的是怎樣找到到達(dá)節(jié)點(diǎn)的路徑,定義一個(gè)棧,從根節(jié)點(diǎn)開(kāi)始遍歷,棧先存儲(chǔ)根節(jié)點(diǎn),然后判斷是否等于要找的節(jié)點(diǎn),不等于則繼遍歷根節(jié)點(diǎn)的左右子樹(shù),左右子樹(shù)又是新的根節(jié)點(diǎn),如果左右子樹(shù)不為要找的節(jié)點(diǎn),則遍歷他們的子樹(shù),還是找不到,則出棧,即這個(gè)節(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;
}
}方法二-子問(wèn)題

pq的分布為以上三種情況,pq為root時(shí),就是公共祖先,若不是這種情況,則遞歸調(diào)用尋找root的左右子樹(shù)節(jié)點(diǎn)是否有p或q。pq分布在root左右兩側(cè)時(shí),root就是公共祖先,pq分布在單側(cè)時(shí),先找到的即為兩個(gè)節(jié)點(diǎn)的公共祖先。子問(wèn)題體現(xiàn)在尋找pq時(shí),每個(gè)子樹(shù)都會(huì)調(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二叉樹(shù)中LCA問(wèn)題解決方法兩則的文章就介紹到這了,更多相關(guān)Java二叉樹(shù)中LCA問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring注解驅(qū)動(dòng)之@EventListener注解使用方式
這篇文章主要介紹了Spring注解驅(qū)動(dòng)之@EventListener注解使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
java實(shí)現(xiàn)后臺(tái)處理base64圖片還原為文件
這篇文章主要介紹了java實(shí)現(xiàn)后臺(tái)處理base64圖片還原為文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
springBoo3.0集成knife4j4.1.0的詳細(xì)教程(swagger3)
這篇文章主要介紹了springBoo3.0集成knife4j4.1.0的詳細(xì)教程(swagger3),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Spring源碼如何修改Bean的屬性用到的相關(guān)類
這篇文章主要介紹了Spring源碼如何修改Bean的屬性用到的相關(guān)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java實(shí)現(xiàn)對(duì)稱加密DES和AES的示例代碼
這篇文章主要介紹了如何使用Java實(shí)現(xiàn)采用對(duì)稱密碼算法的應(yīng)用軟件,所用算法包括DES算法和AES算法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-04-04
SpringCloud學(xué)習(xí)筆記之Feign遠(yuǎn)程調(diào)用
Feign是一個(gè)聲明式的http客戶端。其作用就是幫助我們優(yōu)雅的實(shí)現(xiàn)http請(qǐng)求的發(fā)送。本文將具體為大家介紹一下Feign的遠(yuǎn)程調(diào)用,感興趣的可以了解一下2021-12-12
詳解Java圖形化編程中的鼠標(biāo)事件設(shè)計(jì)
這篇文章主要介紹了Java圖形化編程中的鼠標(biāo)事件設(shè)計(jì),是Java的GUI開(kāi)發(fā)中的基礎(chǔ)部分,需要的朋友可以參考下2015-10-10

