題目
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
思路
這一次說的是一個普通的二叉樹,給出兩個節點。求他們的最低公共父節點。
回憶一下,當這棵二叉樹是二分查找樹的時候的解決方式:
二分查找樹解法:http://blog.csdn.net/langduhualangdu/article/details/47426339
沒錯。無論是二分查找樹也好還是普通二叉樹也好。他們的共同規律就是:所給出的兩個節點一定在最低公共父節點的兩側。
那對于BST來說。能夠通過大小進行比較推斷是不是在當前節點的兩側。普通二叉樹怎樣比較呢?
事實上,我們能夠從反面去考慮這個事情:假設當前節點的某一側子樹沒有所給節點中的不論什么一個。那是不是就能肯定,該節點一定不是最低父節點(節點重合的情況另說),并且,所求節點一定在還有一側。
因此。我們能夠這樣:當前節點假設為null,返回null;假設為所給節點當中之中的一個,則返回該節點;否則,求出當前節點左子樹的返回值和右子數的返回值,假設左右值都不為空。說明當前節點即為所求節點,否則,返回不為空的那個節點。
相同,當得到所求節點后。還是須要檢查所在的樹上是不是同一時候存在所給的兩個節點。應該比較的是節點的地址而不是值。
代碼
public boolean checkExist(TreeNode root, TreeNode p, TreeNode q){if(root==null)return false;boolean pExist = false, qExist = false;Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.add(root);while(!queue.isEmpty()){TreeNode treeNode = queue.poll();if(treeNode==p)pExist = true;if(treeNode==q)qExist = true;if(pExist && qExist)return true;if(treeNode.left!=null)queue.add(treeNode.left);if(treeNode.right!=null)queue.add(treeNode.right);}return false;}public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {TreeNode candidateNode = search(root, p, q);if(checkExist(candidateNode,p,q))return candidateNode;else {return null;}} public TreeNode search(TreeNode root, TreeNode p, TreeNode q){if(root==null)return null;if(root==p || root==q){return root;} else{TreeNode left = search(root.left, p, q);TreeNode right = search(root.right, p, q);if(left!=null && right!=null)return root;else {return left!=null?left:right;}}}