关于binary trees
,我了解size
和height
之间的区别:size
是节点数,height of a tree
是最大边数根到最远的叶子。
然而,在处理涉及height
的问题时,我的思绪经常被扭曲,无法直接思考。
对于以下两个问题,它们非常相似,只有一个对size
有约束,而另一个有height
。
例如,让我们首先使用size
。
在完全平衡的二叉树中,以下属性成立 每个节点:左子树中的节点数和数量 右子树中的节点几乎相等,这意味着它们的节点 差异不大于一。
编写一个函数来构建所有可能的完全平衡的二进制文件 给定节点数的树 - n 。该函数应该生成所有 通过回溯的解决方案。将字母'x'作为信息放入所有 树的节点。
只要属性被保留,这个问题就是生成所有可能完全平衡的二进制tress。
我认为size
很简单。我能做的就是这样:
n=n/2
生成所有这些树,然后用新根合并每对树。n/2
的树和另一组具有n/2-
的树。然后将每一对(一组中的一个)与一个新根合并,也不要忘记交换每对中的元素。当问题中的size
更改为height
时,我真的不知道如何巧妙地再思考。
在高度平衡的二叉树中,以下属性成立 每个节点:其左子树的高度及其右侧的高度 子树几乎相等,这意味着它们的差异并不大 而不是一个。
编写一个函数来构建所有可能的高度平衡二叉树 对于给定数量的节点 - n 。该功能应通过生成所有解决方案 回溯。将字母“x”作为信息放入所有节点 树。
我认为如果涉及身高,事情就会变得随意。
第二个问题的解决方案是否与第一个问题相同?
我应该如何训练自己处理身高?诀窍在哪里?
答案 0 :(得分:1)
不,这不一样。考虑:(每个节点的值表示其子树的高度)
4
/ \
2 3
/ / \
1 2 2
/ \ / \
1 1 1 1
左子树有2个节点,右边有7个,但它是高度平衡的。
您需要做的第一件事是计算某个给定高度的最小和最大节点数(最大值只是2^n-1
,最小值可以从高度1开始迭代计算,或者可能是也是一个公式。)
然后你需要遍历左子树和右子树的高度(这将是左子树的高度+ 1/0 / -1),如果我们可以使用这些来到n
高度,即:这些高度加上一个的最大节点数为>= n
,这些高度加上一个的最小节点数为<= n
,循环遍历{{1}的所有组合,生成所有有效的树,并合并它们,类似于你为第一个问题所做的。
我希望这是有道理的。
处理涉及高度的问题并没有真正的诀窍 - 这种方法因问题而异。通常重要的是要记住,平衡树的高度为n
,而高度~log2n
的完整树具有n
个节点。