【问题标题】:Exercise review Trees binary c++练习回顾 Trees binary c++
【发布时间】:2015-05-20 15:16:03
【问题描述】:

给定一棵二叉树,其根位于宝藏处,其内部节点可以包含一条龙或不包含任何东西,要求您设计一个算法,告诉我们到根路径的树的叶子有龙的数量最少。如果有多条路径具有相同数量的龙,则算法将返回所有路径左侧较多的路径。为此,请实现一个函数,该函数获取其节点存储整数的二叉树:

  1. 根包含整数0,代表宝物。
  2. 内部节点包含整数1表示节点有龙或整数2表示没有龙。
  3. 在每个叶子中存储一个大于或等于 3 且不能重复的整数。并将整个工作表返回到所选路径。该树具有至少一个根节点和一个不同于根的叶节点。例如,给定以下树(示例中显示的第二个测试用例),算法返回整数 4。

我不能上传示例树的图片,但是有人告诉我,我可以通过所有的树枝,知道哪条龙少的路径,我会很感激。

问候!

【问题讨论】:

  • 你实际上在问什么不清楚,除了它与 C++ 无关。

标签: algorithm binary-tree tree-traversal


【解决方案1】:

您想递归地考虑这些问题:如果您在父节点处...

  • 没有孩子,你必须没有龙和节点计数器,并且你认为自己有 0 条龙并且是最好的节点:如果被问到,你会告诉你的父母

  • 一个左分支和/或一个右分支,然后你问你的孩子他们的龙数以及他们认为哪个节点最好,如果左节点报告的龙数更少或相等......

    • 您可以从中获取最佳节点和龙数,ELSE

    • 您从正确的节点获取最佳节点和龙数

    如果你的节点存储的是整数 1,那么你就给dragon-count 加 1

通过在根节点开始处理,您可以获得整棵树的结果。

【讨论】:

    【解决方案2】:

    这是第一个想到的算法。假设您有一个数组将值存储在节点 node_value[NODE_NUM] 中,其中 NODE_NUM 是树中的节点数,并且您使用数组存储每个节点的子节点索引 left[NODE_NUM]right[NODE_NUM],您的根目录将具有索引 root_index。我们会在数组dragon[NODE_NUM]中存储到root的路径中龙的数量信息,所以算法伪代码为:

    # the recursive function itself   
    process(node_index):
        n_left <- 0
        if node_value[left[node_index]] = 1
            n_left <- 1
        n_right <- 0
        if node_value[right[node_index]] = 1
            n_right <- 1
    
        dragon[left[node_index]] <- dragon[node_index] + n_left
        dragon[right[node_index]] <- dragon[node_index] + n_right
        process(left[node_index])
        process(right[node_index])
    
    # the number of dragons in path from root to root is, obviously, zero:
    dragon[root_index] <- 0
    
    # Call the function itself
    process(root_index)        
    

    之后,在dragon中,我们将获得从树中每个节点到根的龙的数量。现在,您所要做的就是遍历所有节点并找到叶子节点并且其值最小:

    min <- infinity
    node_min <- unknown
    for each node:
        if node_value[node] >= 3:
            if dragon[node] < min:
                min <- dragon[node]
                node_min <- node
    
    return node_min
    

    现在,node_min 是根路径中龙最少的节点。

    【讨论】:

      猜你喜欢
      • 2023-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多