2012-01-07 3 views
4

Я закончил красное черное дерево в c, и мне трудно распечатать его в порядке уровня. У меня есть print-inorder, но я не могу представить, как я должен отображать его как дерево в консольной печати. Возможно ли это? Можем ли мы реализовать BFS или DFS здесь? Я нашел алгоритм в wiki, но я не могу его применить. Если у кого есть код для этого в C, вы можете разместить его здесь, чтобы я мог его изучить? из вики:Red Black tree print в порядке уровня в C

levelorder(root) 
    q = empty queue 
    q.enqueue(root) 
    while not q.empty do 
    node := q.dequeue() 
    visit(node) 
    if node.left ≠ null 
     q.enqueue(node.left) 
    if node.right ≠ null 
     q.enqueue(node.right) 
+2

Это домашнее задание? Пожалуйста, отметьте, если это так. – dasblinkenlight

+1

хорошо красное черное дерево было для домашней работы. печатать его в этой форме нет. Его только для меня :) – BugShotGG

ответ

4

Вы можете сделать BFS, но это может быть проще сделать iterative deepening search, так что сэкономит вам неприятности реализации очередь FIFO в С. псевдокод:

algorithm iterative-deepening(root) 
    D = max-depth(root) 
    for d=0 to D 
     depth-limited-search(root, d) 

/* variant of DFS */ 
algorithm depth-limited-search(node, d) 
    if node != NULL 
     if d == 0 
      print node.contents 
     else 
      depth-limited-search(node.left, d - 1) 
      depth-limited-search(node.right, d - 1) 
+0

ну как я могу найти максимальную глубину RBT? мне нужно добавить счетчик, когда я вставляю данные? – BugShotGG

+0

@GeoPapas: есть много вариантов, чтобы получить глубину. Обратите внимание, что свойства красно-черного дерева гарантируют определенную максимальную глубину в зависимости от количества элементов. Вы также можете сделать DFS. –

+0

, поэтому я мог бы сделать одно движение дерева от корня до листа (с левым и правым дочерними элементами равным нулю) и подсчитать узлы, с которыми я встречался. Это должно дать приблизительную высоту? – BugShotGG