2011-02-12 121 views
1

我处于这种情况,我需要从子节点构建树,即我必须从子节点行进到父节点我的问题是可能的,这是什么算法?树形层次结构问题

在此先感谢

+0

你可以举一个你的数据结构的例子吗? – 2011-02-12 06:56:29

+0

从下往上建树不一定需要向上遍历。请详细解释你想要达到的目标。 – 2011-02-12 07:01:14

回答

0

我做了类似于你在找什么东西。我认为这应该适合你,只需稍作调整。不要抱怨Wordpressiness - 无论如何,你应该能够弄清楚它在做什么。

function find_parents($category_id) { 

    global $wpdb; 

    $category = $category_id; 

    while (1) { 

     $parent_category = $wpdb->get_row(
      $wpdb->prepare("SELECT * FROM hierarchy WHERE id=%d", $category) 
     ); 

     $data[] = array(id => $parent_category->id, name => $parent_category->category_name); 

     if ($parent_category->parent_id == 0) { 
      break; 
     } 

     $category = $parent_category->parent_id; 

    } 

    return $data; 

} 

这将以相反的顺序返回一个数组或项目,以及每个后续的父项。

功能再往相反的方向,从顶部类别,将检索所有类别,是:

function find_children($parent_id, $data) { 

    foreach ($data as $child) { 

     if ($child->parent_id == $parent_id) { 
      $children[] = array(
       'attr' => array(
        'id' => 'cat_' . $child->id, 
        'dbid' => $child->id, 
        'link_to' => $child->link_to, 
        'rel' => ($child->link_to ? 'link' : 'default') 
       ), 
       'data' => $child->category_name, 
       'children' => find_children($child->id, $data) 
      ); 
     } 

    } 

    return $children; 

} 

他们俩之间,你可能能够凑齐的东西在一起,我希望:/

1

使用自引用关系(或邻接列表模型)来表示分层数据从来就不是一个好主意。最好的方法是使用Interval Trees或者Nested Sets。迄今为止关于此主题的最佳参考资料是MySQL Developer Zone网站上的最佳参考资料,可以找到here。我已经使用这篇文章(和其他资源)使用Lambda表达式在C#中编写我自己的实现。但是我引用的文章在解释概念和显示一些随时可用的SQL代码方面做得很好。