我正在尝试创建一个二叉树。我唯一给出的是树中节点的数量。弹出的第一件事就是使用索引( BFS顺序)来跟踪总节点数,然后使用递归定义。这是我的伪代码。
N = 10 //binary tree total node count
i = 0 //global integer
function()
if i > N
return True
create node i
i = i + 1
function(i) //left
i = i + 1
function(i) //right
我必须在这个定义中使用一个全局变量,这让我觉得我可能违反了递归规则。有没有更好的方法来做我做的事情,如果是这样的话,可以改进吗?
注意:我在询问理论方法,而不是代码。
编辑:我刚才意识到这种方法失败了。我愿意接受建议。
澄清:如果前一个深度没有填充节点(所有节点都有2个孩子),那么这个树的要求就是不向深度添加元素,请原谅我没有提到这个之前,对于我在评论中提到的堆栈,它与问题无关,只是迭代遍历树的常规方式。
答案 0 :(得分:1)
如果以递归方式定义,树由三个元素组成:
所有这些可能是NULL
。
现在我们可以通过以下方式将范围[a, b]
中的数字分发到树中:
(a + b) / 2
[a, (a + b) / 2 - 1]
构建[(a + b) / 2 + 1, b]
构建的起点高于终点的范围可能被视为空,导致节点为NULL
。此分布确保左右子树的大小最多相差1,并且每个级别完全填满,然后再填充另一个级别。
E.g:
N = 6
[0, 5]
[0, 1] 2 [3, 5]
[0] 1 [] [3] 4 [5]
[] 0 [] [] 3 [] [] 5 []
此外,该算法构建了一个BST(实际上这基本上是二进制搜索的"反向")。现在算法本身:
function(a, b):
if b < a: return NULL
n = create node (a + b) / 2
n.left = function(a, (a + b) / 2 - 1)
n.right = function((a + b) / 2 + 1, b)
return n
可以通过调用
生成树function(1, N)
或者,任何其他参数a
和b
应该有效,其中a + N - 1 = b
成立。这两个参数表示应该由树保存的范围(包括两者)。