【问题标题】:Binary Tree - Random Generator二叉树 - 随机生成器
【发布时间】:2015-03-04 18:31:38
【问题描述】:

假设我有一棵像这样的二叉树 -

       5               
      / \       
     /   \      
    /     \     
   /       \    
   2       8       
  / \     / \   
 /   \   /   \  
 1   3   6   9   
      \   \   \ 
      4   11   10 

现在我有一个随机生成器,它将生成一个介于 1 到树大小之间的数字(在本例中为 10)。基于随机生成器生成的随机值,我必须从树中返回节点(假设生成器给定 7,所以我返回第 7 个节点(值 11),进行中序遍历)。明天我再向树中添加 4 个节点。如何保持一致性?与中一样,为随机值返回树中的相同节点。中序遍历会创建不同的数组,索引的值会发生变化。

【问题讨论】:

  • 中序遍历是我的方法,但是一旦我添加更多节点,它就不会保持一致。
  • 一致性在这里意味着什么?在示例树中,如果随机数为 7,则它返回第 7 个元素,即 7(很多个 7!)如果明天您插入值 0、3.5、11 和 14,您是否仍然 如果随机数是 7,想要返回 7?或者您想返回有序遍历中的第 7 个数字(现在是 5)。 (请注意,中序遍历将始终按排序顺序生成元素。)
  • 这应该是一个有效的二叉搜索树吗?如果是,则 11 放错地方了。
  • 不,它只是任何二叉树。这里的树看起来像 BST,但问题是二叉树。

标签: java algorithm random data-structures binary-tree


【解决方案1】:

除非您的目标是通过向二叉树添加节点来构造二叉树,并且在某个点冻结索引和节点之间的映射,否则您的问题实际上没有意义,以便 未来对树的添加(在冰点之后)不会更改该映射。

目前尚不清楚您要完成什么,但我可以看到几种可能性。如果您的意图是可以在树中的任何位置添加新节点,那么它们实际上不能有任何索引可以明智地映射到它们。在这种情况下,我只需在冰点创建一个映射(例如HashMap),将索引映射到节点。使用中序遍历遍历树,构建地图,并将其与树结构一起保存。使用映射来确定索引的节点,而不是遍历树。

如果您不想在树中的任何位置添加节点,而是想在某个位置添加节点以使原始节点仍然具有相同的索引,那么您需要做的就是沿着树的右子节点向下移动,直到您点击一个没有右孩子的节点。在您发布的示例中,这将是节点10

       5               
      / \       
     /   \      
    /     \     
   /       \    
   2       8       
  / \     / \   
 /   \   /   \  
 1   3   6   9   
      \   \   \ 
      4   11   10**

在您要冻结的位置标记该节点。然后,当您添加新节点时,必须将新节点添加为标记节点的右子节点 - 或者如果标记节点具有右子节点 R(因为您已经添加冻结后的一个),任何它将成为R的后代的地方。以这种方式添加的新节点将始终按顺序遍历出现在冰点的节点。因此之前添加的节点的索引不会受到影响。

如果这些都不是您想要的,您需要提供更多关于您需要什么的说明。

【讨论】:

    【解决方案2】:

    一种选择是在有序遍历中添加任何新节点作为最后一个节点的右子节点。这将导致一棵非常深且不平衡的树;你没有要求平衡树,所以可能没关系。

    【讨论】:

      猜你喜欢
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      相关资源
      最近更新 更多