Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 寻找构造二叉搜索树的时间复杂度_Algorithm_Binary Tree_Binary Search Tree - Fatal编程技术网

Algorithm 寻找构造二叉搜索树的时间复杂度

Algorithm 寻找构造二叉搜索树的时间复杂度,algorithm,binary-tree,binary-search-tree,Algorithm,Binary Tree,Binary Search Tree,假设我们有顺序遍历顺序和顺序后遍历。例如: 顺序:30 40 45 50 65 70 80 邮购:30 45 40 65 80 70 50 我知道如何根据给定的顺序遍历和顺序后遍历构造二叉搜索树,但我的问题是,如果给定顺序后遍历,B.S.T构造的平均和最坏情况时间复杂度是多少?对于朴素的BST构造算法,这两种情况下的时间复杂度都是O(n^2),因为: 在顺序情况下,算法将添加到右侧 在后订单情况下,算法将添加到左侧 所以T(n)=1+2+3+。。。n-1=O(n^2) 更新_3:但在后序情况下,

假设我们有顺序遍历顺序和顺序后遍历。例如: 顺序:30 40 45 50 65 70 80 邮购:30 45 40 65 80 70 50


我知道如何根据给定的顺序遍历和顺序后遍历构造二叉搜索树,但我的问题是,如果给定顺序后遍历,B.S.T构造的平均和最坏情况时间复杂度是多少?

对于朴素的BST构造算法,这两种情况下的时间复杂度都是O(n^2),因为:

在顺序情况下,算法将添加到右侧

在后订单情况下,算法将添加到左侧

所以T(n)=1+2+3+。。。n-1=O(n^2)

更新_3:但在后序情况下,我们可以简单地将下一个元素添加为根(上一棵树变为左子),因此复杂性为O(n)

更新:当然,数字排列的平均时间是O(n logn),但在这种情况下,这个时间是O(n^2)(n是数字的数量)


更新\u 2:有关更多详细信息,请查看底部的注释。

您可以使用O(n)中的后序遍历,使用以下基本原理构建树:

  • 最后一个元素始终是树根
  • 所有先前大于根的元素都是右子树的一部分。所有元素都是左子树的一部分
  • 您可以递归地应用上述规则
从秩序的构建更为琐碎。您只需选择中间元素作为根,并在两侧递归调用它

下面是一个示例实现(Python),它显示了这两种结构:

从集合导入数据
def打印图形(树):
如果不是isinstance(树、元组):
回归树
左=打印图形(树[0])
右=打印图形(树[2])
如果left不是None:打印树[1],'->',left
如果right不是None:打印树[1],'->',right
返回树[1]
def访问后订单(在队列中,限制=无):
如果len(在_队列中)==0或在_队列中[-1]<限制:
一无所获
root=在_queue.pop()中
右=访问后订单(在队列中,最大(根,限制))
左=访问后订单(在队列中,限制)
如果左为无,右为无:
返回根
其他:
返回(左、根、右)
def按顺序访问(按顺序、开始、结束):
如果begin==end:返回None
如果开始+1==结束:按顺序返回[开始]
中间=(开始+结束)/2
根=按顺序[中间]
左=按顺序访问(按顺序、开始、中间)
右=按顺序访问(按顺序,中间+1,结束)
如果左为无,右为无:
返回根
其他:
返回(左、根、右)
来自邮政订单的def(邮政订单):
回访后订单(deque(后订单))
def从_按_顺序(按_顺序):
回访顺序(顺序,0,len(顺序))
打印“有向图{”
打印打印图形(从打印后顺序([0,2,1,4,3,6,8,7,5]))
#打印打印图形(按[1,2,3,4,5,6,7,8]的顺序从打印到打印)
打印“}”
像这样跑:

python test.py | dot -Tpng | display
您将有一个很好的树输出:


如果您知道如何实现某些功能,请计算基本操作的数量。如果是递归的,写一个递归。这取决于你使用的算法。例如,在最坏的情况下,这里有一个在O(n log n)中工作的方法:可能的重复我们可以从O(n)中的后序遍历创建BST吗?虽然我们需要先对后序遍历进行排序,以便在给定两次遍历的情况下按顺序进行了解,但这可能比O(N^2)做得更好。我理解,但我认为他指的是BST构造算法的基本版本,他是按顺序插入数字。那么复杂性是O(n^2)你回答了错误的问题。您的答案解决了从无序遍历以简单方式创建BST的时间复杂性。这不是他问的问题。他问(虽然不是很清楚)使用利用后序遍历固有顺序的算法的最佳和最差时间复杂度。在这种情况下,我们甚至可以记住指向树中最大元素的指针,并将每个元素添加到O(1)中。当然,这个BST也会变形。有O(n)算法可以从两个遍历构造BST。“你回答了错误的问题”[2]。我是否遗漏了什么,或者如果你只是从末尾突然出现,为什么要在订单后案例中使用deque?如果不需要双端或左起操作,普通列表将更简单、更快。