如何在不旋转父级的情况下平衡 PHP 中的二叉树?
我会尽力让自己尽可能清楚。基于邻接列表模型: http://articles.sitepoint.com/article/hierarchical- data-database
我需要一种方法来平衡这棵树
0
/ \
1 2
/ / \
3 4 5
\ \
6 7
,如下所示:
0
/ \
1 2
/ \ / \
3 4 5 6
/
7
基于示例代码:
<?php
function display_children($parent, $level) {
$result = mysql_query('SELECT title FROM tree '.
'WHERE parent="'.$parent.'";');
while ($row = mysql_fetch_array($result)) {
echo str_repeat(' ',$level).$row['title']."\n";
display_children($row['title'], $level+1);
}
}
?>
我修改了代码,以便它可以输出如下所示的平面 html 表:
$super_parent = '0000' 将左节点条目放入平面列表中:
____________________________________________________
| No. | Date of Entry | Account ID | Placement|
------------------------------------------------------
| 1 | 2010-08-24 11:19:19 | 1111a | a |
| 2 | 2010-08-24 11:19:19 | 22221a_a | a |
| 3 | 2010-08-24 11:19:19 | 33_2aa | b |
| 4 | 2010-08-24 11:19:19 | 33_2Ra | a |
| 5 | 2010-08-24 11:19:19 | 22221a_b | b |
| 6 | 2010-08-24 11:19:19 | 33_2ba | a |
| 7 | 2010-08-24 11:19:19 | 33_2bb | b |
------------------------------------------------------
但我需要一种方法将所有这些重新组织成平衡树,而无需移动或旋转父级。虽然我可以考虑在数据库中创建一个重复的表并执行第二个查询来显示或创建另一个二进制树,但我认为可以将这样的平面树重新组织为:
0
/ \
1 2
/ \ / \
3 4 5 6
/
7
从左到右。 0 代表父级或 super_parent 0000。
我想这样做的原因是这样我可以从原始树创建一个虚拟树,这将成为我的项目中另一个算法的基础。
提前致谢。
鲍勃
I will try to make myself as clear as possible. Based from Adjacency List Model: http://articles.sitepoint.com/article/hierarchical-data-database
I need a way to balance this tree
0
/ \
1 2
/ / \
3 4 5
\ \
6 7
to something like:
0
/ \
1 2
/ \ / \
3 4 5 6
/
7
Based from the sample Code:
<?php
function display_children($parent, $level) {
$result = mysql_query('SELECT title FROM tree '.
'WHERE parent="'.$parent.'";');
while ($row = mysql_fetch_array($result)) {
echo str_repeat(' ',$level).$row['title']."\n";
display_children($row['title'], $level+1);
}
}
?>
I modified the code so it can output a flat html table like this:
$super_parent = '0000'
left Node entries into flat list:
____________________________________________________
| No. | Date of Entry | Account ID | Placement|
------------------------------------------------------
| 1 | 2010-08-24 11:19:19 | 1111a | a |
| 2 | 2010-08-24 11:19:19 | 22221a_a | a |
| 3 | 2010-08-24 11:19:19 | 33_2aa | b |
| 4 | 2010-08-24 11:19:19 | 33_2Ra | a |
| 5 | 2010-08-24 11:19:19 | 22221a_b | b |
| 6 | 2010-08-24 11:19:19 | 33_2ba | a |
| 7 | 2010-08-24 11:19:19 | 33_2bb | b |
------------------------------------------------------
But I need a way to reorganize all this into a balanced tree without moving or rotating the parent. Although I can think of creating a duplicate table in the db and do a second query to display or create another Binaray tree, I thought it may be possible to reorganize a flat tree like this into:
0
/ \
1 2
/ \ / \
3 4 5 6
/
7
From left to right. 0 represents the parent or super_parent 0000.
The reason I would like to do this is so I can create a virtual tree from the original tree that will be the basis of another algorithm in my project.
Thanks in advance.
Bob
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我决定用这个发现来回答我自己的问题。一般来说,这可以称为从左到右递归地自动化平衡二叉树的“分布方法”。该算法确保每个级别处理 64 对,其余的将被清除:)
超级父级的左前线节点应计为 1。对于剩余 8 个条目,只需调用:
谢谢
Oliver Bob Lagumen
I have decided to answer my own question with this discovery. In General, this can be called, the "Distribution Method" of recursively automating a Balanced Binary Tree from left to right. This algorithm makes sure to take care of 64 pairs per level and the rest would be flushed out : )
The left frontline node of super parent should be counted as 1. For 8 entries left, just call:
Thanks
Oliver Bob Lagumen
这是我用来构建二叉树数据结构及其相应操作的完整代码:
This is the complete code i used to build a binary tree datastructure and its corresponding operations: