leetcode——Lowest Common Ancestor of a Binary Tree
阿新 • • 發佈:2017-08-05
sdn 右值 split arc candidate tex 查找樹 也好 左右
題目
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;
}
}
}
leetcode——Lowest Common Ancestor of a Binary Tree