Algorithm 寻找构造二叉搜索树的时间复杂度
假设我们有顺序遍历顺序和顺序后遍历。例如: 顺序:30 40 45 50 65 70 80 邮购:30 45 40 65 80 70 50Algorithm 寻找构造二叉搜索树的时间复杂度,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:但在后序情况下,
我知道如何根据给定的顺序遍历和顺序后遍历构造二叉搜索树,但我的问题是,如果给定顺序后遍历,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)中的后序遍历,使用以下基本原理构建树:
- 最后一个元素始终是树根
- 所有先前大于根的元素都是右子树的一部分。所有元素都是左子树的一部分
- 您可以递归地应用上述规则
从集合导入数据
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?如果不需要双端或左起操作,普通列表将更简单、更快。