【问题标题】:Delete/Collapse Binary Tree in PHP在 PHP 中删除/折叠二叉树
【发布时间】:2013-07-20 10:38:29
【问题描述】:

我有一张这样的桌子

----------------------------------
CUSTOMER_ID    | REF_CUSTOMER_ID |   
----------------------------------
1              | NULL            | 
2              | 1               | 
3              | 2               | 
4              | 2               | 
5              | 3               |
6              | 3               | 
7              | 4               |
8              | 4               |  
9              | 1               |  
----------------------------------

从该表可知 2 是 1 的孩子,3,4 是 2 的孩子,依此类推。 这使树看起来像这样

                1
                |
        ------------------
        |                |
        2                9
        |                |
    -----------     
    |        |                
    3        4   
    |        |
  -----    -----
  |   |    |   |
  5   6    7   8 

好的,在每个父母有 2 个孩子和 4 个叶子之后,在这种情况下,2 个有 3 和 4 的孩子和 5、6、7、8 的叶子,树将不得不倒塌。这意味着它只会在树中留下 1。但是由于 2 是 1 的子节点,而 3,4 是 1 的叶子,并且 1 还没有完成它的循环,所以 1 还不能崩溃。

问题

我如何仍然将 2 的树折叠为根,但保持 1 的树及其子节点和叶子?我该如何处理?我必须创建另一个表吗?还是只使用现有的表?

【问题讨论】:

  • 您能解释一下“折叠”是什么意思吗?我不明白你的问题......也许你可以发布一张你希望树最终看起来像什么的图表。
  • 另外,3 和 4 不是叶子。叶节点是没有子节点的节点,但在本例中,3 和 4 都有两个子节点。
  • 折叠 - 意思是我想删除树及其所有节点。但在这种情况下,如果 2 是根,则整个树的根必须折叠为 2。但是1作为根还没有完成一个循环,所以1不能崩溃。我知道上图中的 3 和 4 不是叶子。但是如果 1 是根并且您忽略 5678,则 3 和 4 是 1 的叶子。循环仅在树的 2 级完成。这意味着您必须分别查看 2 和 1。但在 BIG TREE 结构中,两者是相互关联的。

标签: php tree binary-tree collapse


【解决方案1】:

你不必使用额外的表,你可以使用递归删除树:

伪代码:

function deleteChildBranches(node)
{
    get left and right child nodes
    if(there's left branch node)
       deleteANode(left branch node)
    if(there's right branch node)
       deleteANode(right branch node)       
}

function deleteANode(node)
{
    get left and right child nodes
    if(there's left branch node)
       deleteANode(left branch node)
    if(there's right branch node)
       deleteANode(right branch node)
    delete this node
} 

这段代码会先遍历一棵树到底部,从底部到顶部删除节点。

【讨论】:

  • 如果我这样做了,2 作为 ROOT 的树将从数据库中删除。正确的。但是在将 2 删除为 ROOT 之后,我希望 2 保持为 1 的 CHILD,在上图中它不会崩溃,因为 1 的右孩子是 9 没有孩子。如果 2 作为根,我想从整个树中删除。但保持 2 作为 1 的子节点。
  • 我不确定您想要实现什么。但是我添加了一个函数,它不会删除删除开始的节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2021-05-04
  • 2015-01-14
  • 2016-01-08
相关资源
最近更新 更多