【Java】 劍指offer(68) 樹中兩個結點的最低公共祖先


 

本文參考自《劍指offer》一書,代碼采用Java語言。

更多:《劍指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.這里的方法根據特性:兩個樹結點分別在左右子樹上時,該根結點就是最低公共祖先;非常方便,一定要掌握。

 

更多:《劍指Offer》Java實現合集  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM