2011-02-12 152 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代碼方面做得很好。