java - 二叉树中最低的共同祖先。超过时间限制

标签 java data-structures binary-tree lowest-common-ancestor

我编写了这个解决方案来查找二叉树的 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)

关于java - 二叉树中最低的共同祖先。超过时间限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004511/

相关文章:

java - 为 JPanel 创建构造函数来创建圆圈?

mysql - 如何组织地理空间的模型类和相关数据库数据?

javascript - 在 javascript 中从堆栈中弹出原型(prototype)会导致未定义

arrays - 根据第二个数组的元素对数组进行排序

python - 如何使用ADT在python中搜索二叉树节点以获得最长的树

java - 为什么我的 InOrder 排序的 ArrayList 不能递归地构建 LinkedBinaryTree?

java - 如何从 javaFX 中的 webView 获取 SelectedText

java - 无法让 JTable 出现在 GUI 上..我错过了什么?

java - 在 Tomcat 6 中拦截对 HttpSession 的调用

c - C 中的二叉树 : Traversal specified level