+-----------------------+
| parent | name |
+-----------------------+
| | Food |
| Food | Fruit |
| Fruit | Green |
| Green | Pear |
| Fruit | Red |
| Red | Cherry |
| Fruit | Yellow |
| Yellow | Banana |
| Food | Meat |
| Meat | Beef |
| Meat | Pork |
+-----------------------+
咱们看到 Pear 是Green的一个子节点,Green是Fruit的一个子节点。而根节点'Food'没有父节点。 为了复杂地描写这个成绩, 这个例子中只用了name来暗示一个纪录。 在实践的数据库中,你需求用数字的id来标示每一个节点,数据库的表布局也许应当像如许:id, parent_id, name, description。有了如许的表咱们就能够经由过程数据库保留全部多级树状布局了。
显示多级树
假如咱们需求显示如许的一个多级布局需求一个递归函数。
<?php
// $parent is the parent of the children we want to see
// $level is increased when we go deeper into the tree,
// used to display a nice indented tree
function display_children($parent, $level)
{
// 取得一个 父节点 $parent 的一切子节点
$result = mysql_query('SELECT name FROM tree '.
'WHERE parent="'.$parent.'";');
<?php
// $node 是谁人最深的节点
function get_path($node)
{
// 查询这个节点的父节点
$result = mysql_query('SELECT parent FROM tree '.
'WHERE name="'.$node.'";');
$row = mysql_fetch_array($result);
// 用一个数组保留途径
$path = array();
// 假如不是根节点则持续向上查询
// (根节点没有父节点)
if ($row['parent']!='')
{
// the last part of the path to $node, is the name
// of the parent of $node
$path[] = $row['parent'];
// we should add the path to the parent of this node
// to the path
$path = array_merge(get_path($row['parent']), $path);
}
// return the path
return $path;
}
?>
假如对"Cherry"利用这个函数:print_r(get_path('Cherry')),就会失掉如许的一个数组了:
Array
(
[0] => Food
[1] => Fruit
[2] => Red
)
接上去若何把它打印成你但愿的格局,就是你的工作了。
弱点:这类办法很复杂,轻易了解,好上手。然而也有一些弱点。次要是由于运转速度很慢,因为失掉每一个节点都需求停止数据库查询,数据量大的时分要停止良多查询才干完成一个树。别的因为要停止递归运算,递归的每级都需求占用一些内存所以在空间使用上效力也对照低。
如今让咱们看一看别的一种不利用递归盘算,加倍疾速的办法,这就是预排序遍历树算法(modified preorder tree traversal algorithm) 这类办法人人能够接触的对照少,初度利用也不像下面的办法轻易了解,然而因为这类办法不利用递归查询算法,有更高的查询效力。