【Java】 劍指offer(68) 樹中兩個結點的最低公共祖先 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
阿新 • • 發佈:2018-11-19
本文參考自《劍指offer》一書,程式碼採用Java語言。
題目
輸入兩個樹結點,求它們的最低公共祖先。
思路
該題首先要和麵試官確定是否為二叉樹,得到肯定答覆後,還要確定是否為二叉搜尋樹,是否有父指標,或者僅僅是普通二叉樹。
1.樹為二叉搜尋樹時,最低公共祖先結點的大小在兩個樹結點大小的中間。
2.樹為普通樹時,使用遍歷將子結點的資訊往上傳遞。在左右子樹中進行查詢是否存在兩個樹結點,如果兩個樹結點分別在左右子樹上,說明該根結點就是它們的最低公共祖先。
測試用例
1.功能測試(普通樹,左斜樹,右斜樹)
2.特殊測試(null)
Java程式碼
/* * 二叉搜尋樹 * 利用大小關係即可 */ public TreeNode getLowestCommonParentBST(TreeNode root,TreeNode node1,TreeNode node2) { while(true) { if(root==null) return root; if(root.val<node1.val && root.val<node2.val) root=root.right; else if(root.val>node1.val && root.val>node2.val) root=root.right; else return root; } } /* * 普通二叉樹 * 將下面結點的資訊利用遞迴s往上傳遞 */ public TreeNode getLowestCommonParent(TreeNode root,TreeNode node1,TreeNode node2) { if(root==null || root== node1 || root== node2) return root; TreeNode left=getLowestCommonParent(root.left, node1, node2); TreeNode right=getLowestCommonParent(root.right, node1, node2); return left==null? right:right==null? left:root; // 上面這句程式碼就是: // if(left==null) { // return right; // }else { // if(right==null) // return left; // else // return root; // } }
收穫
1.《劍指OFFER》一書中的方法:普通二叉樹時,可以採用連結串列來儲存從根結點到兩個樹結點的路徑,找出兩條路徑的最後公共結點,就是最低公共祖先。這個方法也要學會。
2.這裡的方法根據特性:兩個樹結點分別在左右子樹上時,該根結點就是最低公共祖先;非常方便,一定要掌握。