我正在尝试制作一个算法,在给定值列表的情况下创建一个完整的二叉搜索树.完成,因为所有级别都是完整的,除了可能是最后一级,它需要尽可能向左移动所有元素.
我已经实现了一些(在Python中)将创建一个平衡的BST,如下所示:
# TreeNode constructor takes (data, left, right, parent)
def make_tree(arr, parent):
if not arr:
return None
length = len(arr)
if length == 1:
return TreeNode(arr[0], None, None, parent)
else:
mid = int(len(arr)/2)
mid_node = TreeNode(arr[mid], None, None, parent)
mid_node.left = make_tree(arr[0:mid], mid_node)
mid_node.right = make_tree(arr[mid+1:length], mid_node)
return mid_node
Run Code Online (Sandbox Code Playgroud)
它通过递归地按中点分割列表,并使中点成为父节点.
但是,这不会创建完整的 BST.鉴于列表[2,4,7,8,10],它将创建:
7
/ \
4 10
/ /
2 8
Run Code Online (Sandbox Code Playgroud)
但是完整的BST看起来像这样:
8
/ \
4 10
/ \
2 7
Run Code Online (Sandbox Code Playgroud)
您对如何修改我的方法来完成此任务有什么建议吗?
我正在尝试创建一个简单的递归函数,它将在Python中生成嵌套列表的列表.最终结果将代表单个淘汰赛锦标赛.我希望创建这样的列表可以让我轻松生成我需要的东西.这将在以后用于为锦标赛比赛创建模型.
所以,如果有4名参赛者的锦标赛:
[[1,4],[2,3]]
Run Code Online (Sandbox Code Playgroud)
7名参赛者的比赛:
[[1,[4,5]],[[2,7],[3,6]]]
Run Code Online (Sandbox Code Playgroud)
或者是8名参赛者的比赛:
[[[1,8],[4,5]],[[2,7],[3,6]]]
Run Code Online (Sandbox Code Playgroud)
我还没有算法类(我希望课程最终会帮助这样的事情)所以我不完全确定如何解决这个问题.以下是我到目前为止的尝试.
def decide_rounds(list_to_fill, player_nums):
if len(player_nums) < 3:
for num in player_nums:
list_to_fill.append(num)
return
left = []
decide_rounds(left, ??????) #Tried passing various things to these with no avail.
list_to_fill.append(left)
right = []
decide_rounds(right, ???????)
list_to_fill.append(right)
Run Code Online (Sandbox Code Playgroud)
任何有关如何处理此问题的帮助或解释将不胜感激!
编辑:目前我正在调用这样的函数:
rounds = []
decide_rounds(rounds, range(1, size +1))
print rounds
Run Code Online (Sandbox Code Playgroud) 我本质上是在寻找JavaScriptarguments功能,但在Dart中.
这在Dart有可能吗?