【问题标题】:Size of the largest balanced binary subtree [duplicate]最大平衡二叉树的大小[重复]
【发布时间】:2017-07-24 16:23:13
【问题描述】:

我正在尝试创建一个分而治之的算法,当在二叉树的根上运行时,它返回树中包含的最大平衡二叉子树的大小,或者换句话说,最大的平衡二叉树的大小叶子都在相同深度的子树。

【问题讨论】:

  • 只需要一次遍历:编写一个递归函数,它为一个节点返回两个数字:a:看到的最大平衡子树(这是输出)和b:如果该节点有平衡的孩子,然后返回深度。如果没有平衡子节点,则返回 0。您可以通过递归调用计算节点的 b。如果返回的深度匹配,那么您可以为 b 返回 depth+1,否则为零。您需要将a 更新为b。就是这样。
  • 对不起,我没有关注。你能进一步详细说明吗?为什么要为一个节点返回两个数字?如果返回的深度匹配,为什么要为 b 返回 depth + 1?你用什么来更新 a 和 b ?
  • 需要返回 2 个数字,因为一个 (b) 存储当前深度,如果节点不平衡,则该深度可以为零。因此需要 a 来存储当前看到的最大值,该最大值不能减少。通过更新,我的意思是一个简单的 if:if (a
  • 你能停止破坏你的帖子吗?如果您想删除您的帖子,请标记以引起版主注意。
  • 我看不出这是链接问题的副本。不幸的是,最初在问题中的许多细节已被用户删除。我是 SO 的新手,但我不明白为什么我的答案(我相信它确实解决了原始问题)现在遭到了反对。

标签: algorithm tree binary-search-tree graph-algorithm divide-and-conquer


【解决方案1】:

一些代码可能会有所帮助。这是 Java,但它非常通用。

static class Node
{
    String val;
    Node left, right;
}

static class MaxNode
{
    Node node;
    int depth;
}

static int depth(Node node)
{
    if(node.left == null && node.right == null)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

static int deepestSubtree(Node root, MaxNode maxNode)
{
    if(root == null) return 0;

    int depth = depth(root);

    int leftDepth = deepestSubtree(root.left, maxNode); 
    int rightDepth = deepestSubtree(root.right, maxNode);

    if(leftDepth == rightDepth) 
    {
        depth += leftDepth;
    }

    if(depth > maxNode.depth) 
    {
        maxNode.node = root;
        maxNode.depth = depth;
    }

    return depth;
}

public static void main(String[] args)
{
    Node root = buildTree();

    MaxNode maxNode = new MaxNode();
    deepestSubtree(root, maxNode);
    if(maxNode.node == null)
    {
        System.out.println("No Balanced Tree");
    }
    else
    {
        int size = (int)Math.pow(2, maxNode.depth+1)-1;
        System.out.format("Node: %s, Depth: %d, Size: %d\n", maxNode.node.val, maxNode.depth, size);
    }
}

对于您的示例树,输出为:

Node: D, Depth: 2, Size: 7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2022-11-15
    • 2010-09-13
    相关资源
    最近更新 更多