Başka birinin çocukları bir ağacın bütün düğümlerin almak

4 Cevap php

Ben sahibi olan menüye işaret için klasik bir ebeveyn-çocuk olarak PK alanları kimlikli bir veritabanına kaydedilir menüsünü, ve parent_id bir web sistemi var. (Evet, bu çok iyi ölçek değildir biliyorum, ama bu başka bir konu).

Yani bu kayıtların (id-parent_id çift) için:

0-7 0-4 4-9 4-14 4-16 9-6

Ben bu ağacı var:

0
├ 7
└ 4
  ├ 9
  | └ 6     
  ├ 14
  └ 16

Ben bir üst düğüm gizlemek gerek, o yüzden 4 için yani belirli düğümün tüm çocuk, bir listesini yapmak zorunda, onlar (9, 6, 14, 16) olacaktır. Sipariş konularda değil.

Kafam karıştı ... Bu klasik ağaç sorunları sığar mı? ya da bir grafiktir biri?

Nasıl bu yapıyı oluşturmak ve php kullanarak bu sorunu çözebilir?

4 Cevap

Bu özyineleme kullanmak için mükemmel bir fırsat!

Pseudo-kod:

nodeList = {}
enumerateNodes(rootNode, nodeList);

function enumerateNodes(node, nodeList) {
   nodeList += node;
   foreach ( childnode in node.children ) {
       enumerateNodes(childnode, nodeList);
   }
}

Düzenleme: ağaç bitişik liste biçiminde olduğunu fark etmedi. Onunla çalışmaya başlamadan önce muhtemelen sadece gerçek bir ağaç datastructure içine inşa edecek. Tüm çiftleri aracılığıyla sadece loop (düğümlere onları görmek ilk defa oluşturma) ve bunları birbirine bağlayan. I think kolay olmalı ...

Bitişik liste modelleri ile başa çıkmak çok zordur. Ben birlikte olduğum Şirket şimdi hiyerarşileri için bunları kullanır ve büyük baş ağrısı neden olur. Ben başarılı bir önceki işveren için Celko en iç içe seti modellerini kullanmış ve onlar, oluşturma, bakım ve hiyerarşileri (ağaçlar) kullanarak büyük iş.

http://www.intelligententerprise.com/001020/celko.jhtml: Ben bunları tanımlar bu bağlantı bulundu

Ama aynı zamanda "Smarties için SQL: Gelişmiş SQL programlama" kitabı tavsiye ederim Joe Celko tarafından yazılmış ve iç içe kümelerini kapsar.

Joe Celko's SQL for Smarties: Advanced SQL Programming

Joe Celko's Trees and Hierarchies in SQL for Smarties

Bu grafik bir sorundur. BFS(breadth first search) ve DFS(depth first search). göz atın. Sen bu terimleri dışarı google ve web uygulamaları yüzlerce bulabilirsiniz.

Bu iç içe bir dizi uygulama ile saçmadır. Daha fazla bilgi için buraya bakınız:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Aksi takdirde, böyle bir şey yazmak:

def get_subtree(node)
  if children.size > 0
    return children.collect { |n| get_subtree(n) }
  else
    return node
  end
end