组合两个二叉树的算法?

例如:

两棵树:

8 9 5 7 4 20 30 

成为一棵树?

没有更多细节/约束,最简单的解决方案是获取任一树的叶节点,将其删除,并将其用作新创建的三个树的根。

在你的例子中:

  30 8 9 5 7 4 20 

这是有效的,因为您的树似乎不遵循任何特定顺序,看起来不平衡,也没有任何其他约束。

由于任何叶节点都会这样做,所以在最坏的情况下这是一个On )操作(以任何顺序遍历其中一个树,直到我们遇到第一个叶子,删除它,添加到两个树根的子链接)。

合并两个二叉树的最简单方法是迭代一棵树的左子节点,直到到达没有左子节点的节点。 然后将另一棵树的根添加为左子项。 您的示例生成的树将是:

  8 5 7 9 4 20 30 

但是,请注意此示例中生成的树是如何非常不平衡的。 如果这是意图,这将导致对结果树的低效操作。 更好的解决方案是将第二个树的节点均匀分布到第一个树中。 实现此目的的一种方法是递归地将第二树的根和左子树添加到第一树的左子树,并将右子树添加到右子树。 对于稍微均匀的分布,随机选择在每一步分配根的哪一侧。

请注意,这里的二叉树不是二叉树搜索树。 使用BST是一个稍微有趣的案例,因为您必须确保生成的树也是有效的BST。 对于那些感兴趣的人,这里是解决这个问题的方法:在树1中搜索树2的根值。如果我们在没有找到这个值的情况下到达死胡同,我们可以将树2插入到值为的位置。是在树上。 如果我们确实找到了值,那么我们可以用树2替换该节点。然后取出以我们移位的节点为根的子树,并使用相同的算法将其插入树2中。

基本答案就是将较小树中的所有元素添加到较大的树中。

另一种可能性是研究B树(自平衡树)