Java二叉樹中LCA問題解決方法兩則
尋找公共祖先
給定一個二叉樹, 找到該樹中兩個指定節(jié)點的最近公共祖先。
百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節(jié)點 p、q,最近公共祖先表示為一個節(jié)點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節(jié)點也可以是它自己的祖先)。”
方法一-普通解法
思路:可以看作鏈表求交點的問題
首先需要找到到達兩個節(jié)點的路徑并用棧保存下來,然后讓他們在同一起點,即路徑長的先釋放掉兩個路徑長的差值,然后兩個棧依次彈出棧頂元素,若相同,則是這兩個節(jié)點的公共祖先 。比較難的是怎樣找到到達節(jié)點的路徑,定義一個棧,從根節(jié)點開始遍歷,棧先存儲根節(jié)點,然后判斷是否等于要找的節(jié)點,不等于則繼遍歷根節(jié)點的左右子樹,左右子樹又是新的根節(jié)點,如果左右子樹不為要找的節(jié)點,則遍歷他們的子樹,還是找不到,則出棧,即這個節(jié)點不在要找的節(jié)點的路徑里
代碼
/** * 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--; } } //起點已經(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é)點是否有p或q。pq分布在root左右兩側時,root就是公共祖先,pq分布在單側時,先找到的即為兩個節(jié)點的公共祖先。子問題體現(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; } } }
到此這篇關于Java二叉樹中LCA問題解決方法兩則的文章就介紹到這了,更多相關Java二叉樹中LCA問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring注解驅(qū)動之@EventListener注解使用方式
這篇文章主要介紹了Spring注解驅(qū)動之@EventListener注解使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09springBoo3.0集成knife4j4.1.0的詳細教程(swagger3)
這篇文章主要介紹了springBoo3.0集成knife4j4.1.0的詳細教程(swagger3),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07SpringCloud學習筆記之Feign遠程調(diào)用
Feign是一個聲明式的http客戶端。其作用就是幫助我們優(yōu)雅的實現(xiàn)http請求的發(fā)送。本文將具體為大家介紹一下Feign的遠程調(diào)用,感興趣的可以了解一下2021-12-12