我有一个用于树的预先遍历的数组(节点值是深度值).我想要做的就是通过删除只有一个孩子的内部节点的子节点来最小化树.
作为示例(最大深度= 3的树)
problem visualized here
输入数组:[0,1,2,3,3,1,2,3]
输出数组:[0,1,2,2,1]
算法怎么样?
最佳答案 一个简单的O(nlog(n))平均情况算法来自于通过分而治之的方法来攻击问题.
以input_level = 0,output_level = 0,left = 0,right = n-1开始.
在每个递归步骤中,在范围[left,right]中对输入数组A中的值input_level 1进行计数.这些是当前节点的子节点.如果没有这样的元素,请输出output_level并返回.如果只有一个这样的元素,则“删除”当前节点(即不打印它),向左增加1,并递归调用该函数.如果有两个或更多这样的元素,则打印output_level,将output_level增加1,并递归地将函数应用于子元素划分的每个区间.在进行递归调用时始终增加input_level.
对于示例输入A = [0,1,2,3,3,1,2,3],首先算法将在索引1和5处找到值为1的元素.然后它将打印0,增加output_level和current_level 1,并递归调用自身两次:在范围[1,4]和[5,7].
这种情况的复杂性在最坏的情况下是O(n2)(对于实际上是列表的简并树),但平均为O(nlog(n)),作为随机n元树具有高度O(log (N)).