问题描述:给你一个二叉树与两个目标节点,找到距离这两个目标节点的公共父节点中,层级最低的那个。
思路:遍历二叉树找出从根节点到两个目标节点的路径。遍历并比较两个节点的路径。
原答案:
private List<TreeNode> path= new ArrayList<TreeNode>();
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
path.add(root);
List<TreeNode> pathP=findPath(root,p);
path= new ArrayList<TreeNode>();
path.add(root);
List<TreeNode> pathQ=findPath(root,q);
int size1=pathP.size();
int size2=pathQ.size();
int i=0;
for(;i<size1&&i<size2;i++){
if(pathP.get(i).val!=pathQ.get(i).val)
return pathP.get(i-1);
}
return pathP.get(i-1);
}
private List<TreeNode> findPath(TreeNode root,TreeNode node){
path.add(root);
if(root.val==node.val)
return path;
else if(root.val<node.val){
return findPath(root.right,node);
}else{
return findPath(root.left,node);
}
}
最佳答案:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root.val > p.val && root.val > q.val){
return lowestCommonAncestor(root.left, p, q);
}else if (root.val < p.val && root.val < q.val){
return lowestCommonAncestor(root.right, p, q);
}
return root;
}
}
最佳答案思路:如果目标两个节点同时大于或者小于当前节点,那么肯定在对应的一侧还有子节点是这两个节点的父节点。而如果两个目标节点分别大于与小于当前节点。表明这两个节点分散于当前节点两侧。此时如果向任何一侧延伸,都一定不是另一侧的父节点。所以直接返回当前节点。