练习复习树二进制c ++

时间:2015-05-20 15:16:03

标签: algorithm binary-tree tree-traversal

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

  1. 根包含整数0,代表宝藏。
  2. 内部节点包含整数1,表示节点有龙或整数2表示没有龙。
  3. 在每个叶子中存储一个大于或等于3的整数,不能重复。并将整个工作表返回到选定的路径。树至少有一个根节点和一个与根不同的叶节点。例如,给定以下树(示例中显示的第二个测试用例),算法将返回整数4。
  4. 我无法上传示例树的图片,但有人用语言告诉我,我可以通过所有分支,并知道哪条是少龙的路径,我很欣赏它。

    问候!

2 个答案:

答案 0 :(得分:3)

您希望以递归的方式考虑这些问题:如果您在父节点上使用...

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

  • 左侧分支和/或右侧分支,然后您询问您的孩子他们的龙计数和他们认为最佳的节点,如果左侧节点报告的龙计数较小或相等......

    • 你从中获取最佳节点和龙计数,ELSE

    • 您从右侧节点

    • 获取最佳节点和龙数

    然后如果您的节点存储整数1,则向龙计数添加1

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

答案 1 :(得分:1)

这是第一个想到的算法。假设您有一个数组存储节点 node_value[NODE_NUM] 中的值,其中NODE_NUM是树中的节点数,并且您存储每个节点的子节点索引数组 left[NODE_NUM] right[NODE_NUM] ,您的根将拥有索引 root_index 。我们将在数组 dragon[NODE_NUM] 的根路径中存储有关龙数的信息,因此算法伪代码为:

# 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 中,我们将从树中的每个节点获取root的数量。现在,您所要做的就是遍历所有节点并找到一个叶子节点,并且它的值是最小的:

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 是路径中路径最少的节点。