1. 程式人生 > >leetcode——Lowest Common Ancestor of a Binary Tree

leetcode——Lowest Common Ancestor of a Binary Tree

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