给定一个二叉树,其根位于宝藏中,其内部节点可以包含龙或不包含任何内容,系统会要求您设计一种算法,告诉我们树的叶子到根的路径有最低数量的龙。如果有多条路径具有相同数量的龙,则算法将返回更多位于所有路径左侧的路径。为此,请实现一个函数,该函数获取其节点存储整数的二叉树:
我无法上传示例树的图片,但有人用语言告诉我,我可以通过所有分支,并知道哪条是少龙的路径,我很欣赏它。
问候!
答案 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
是路径中路径最少的节点。