我已经编写了用于找到二叉树的LCA的解决方案,它为较大的输入提供了超过时间限制的方法。有人可以指出这段代码中的问题吗?此问题来自Leetcode OJ。
public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null){
return null;
}if((p.val == root.val) || (q.val == root.val)){
return root;
}
if(root.left == null && root.right == null){
return null;
}
boolean leftChildP = isLeftChild(root,p);
boolean leftChildQ = isLeftChild(root,q);
if(isRightChild(root,p) && isLeftChild(root,q)){
return root;
}if(isRightChild(root,q) && isLeftChild(root,p)){
return root;
}
if(leftChildP && leftChildQ){
return lowestCommonAncestor(root.left,p,q);
}
return lowestCommonAncestor(root.right,p,q);}
private boolean isLeftChild(TreeNode root, TreeNode node){
return isChild(root.left,node);
}
private boolean isRightChild(TreeNode root, TreeNode node){
return isChild(root.right,node);
}
private boolean isChild(TreeNode parent, TreeNode child){
if(parent == null){
return false;}
if(parent.val == child.val){
return true;
}return (isChild(parent.left,child) || isChild(parent.right,child));
}}
最佳答案
您编写的代码的复杂度为O(n ^ 2)。
您可以通过两种方式在O(n)中找到LCA
1.)将根存储到两个节点(p和q)的节点路径(在ArrayList中或可以使用哈希集)。现在开始比较两个从根开始的路径中的节点(直到LCA应该同时匹配p和q的路径),因此,路径中发生不匹配之前的节点将是LCA。此解决方案应在O(n)中工作。
2.)其他解决方案的假设是,如果树中仅存在p和q中的一个节点,则lca函数将返回该节点。
这是您可以执行的代码public BinaryTreeNode<Integer> lca(BinaryTreeNode<Integer> root, int data1, int data2){ if(root == null){ return null; } if(root.data == data1 || root.data == data2){ return root; } BinaryTreeNode<Integer> leftAns = lca(root.left, data1 , data2); BinaryTreeNode<Integer> rightAns = lca(root.left, data1 , data2);/// If you are able to find one node in left and the other in right then root is LCA if(leftAns!= null && rightAns != null){ return root; } if(leftAns!=null){ return leftAns; } else{ return rightAns; } }
这也具有时间复杂度O(n)