【问题标题】:Exercise review Trees binary c++练习回顾 Trees binary c++
【发布时间】:2015-05-20 15:16:03
【问题描述】:
给定一棵二叉树,其根位于宝藏处,其内部节点可以包含一条龙或不包含任何东西,要求您设计一个算法,告诉我们到根路径的树的叶子有龙的数量最少。如果有多条路径具有相同数量的龙,则算法将返回所有路径左侧较多的路径。为此,请实现一个函数,该函数获取其节点存储整数的二叉树:
- 根包含整数0,代表宝物。
- 内部节点包含整数1表示节点有龙或整数2表示没有龙。
- 在每个叶子中存储一个大于或等于 3 且不能重复的整数。并将整个工作表返回到所选路径。该树具有至少一个根节点和一个不同于根的叶节点。例如,给定以下树(示例中显示的第二个测试用例),算法返回整数 4。
我不能上传示例树的图片,但是有人告诉我,我可以通过所有的树枝,知道哪条龙少的路径,我会很感激。
问候!
【问题讨论】:
标签:
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 是根路径中龙最少的节点。