Wyświetlania drzewa BST w konsoli

0

Witam,
Proszę o pomoc w wyświetleniu drzewa BST w konsoli. Siedzę już nad tym kilka ładnych dni i nic [???] , nie daje rady.Wyświetlenie w jakiej kolwiek formie byleby było widać (obojętnie jak) gdzie rodzic a gdzie potomek.Może ktoś ma podobne, gotowe rozwiązanie, które mógłbym zaadoptować? Kod drzewa mam zrobiony:

#include <cstdlib>
#include <iostream>

using namespace std;

struct wezel                                                               
{
       int liczba;
       struct wezel *lewy;
       struct wezel *prawy;
} *root;
struct wezel *nowy_wezel(int var)                                             
{
      struct wezel *m_wezel = new(struct wezel);
      m_wezel->liczba = var;
      m_wezel->lewy = NULL;
      m_wezel->prawy = NULL;
      return(m_wezel);
}
struct wezel *dodaj_el(struct wezel *n_wezel, int var)                
{
              if(n_wezel==NULL)
              {
                  return(nowy_wezel(var));   
                  
              }
              else
              {
                  if(var <= n_wezel->liczba)
                         {                                    
                         n_wezel->lewy = dodaj_el(n_wezel->lewy, var);  
                         
                         }
                  else
                         {        
                         n_wezel->prawy = dodaj_el(n_wezel->prawy, var);  
                        
                         }
              }
                         
              return(n_wezel);
              
}
void pokaz(struct *p_root)
{
   //?????????
}
int main(int argc, char *argv[])
{  
    root=dodaj_el(root,6);
    root=dodaj_el(root,3);
    root=dodaj_el(root,8);
    root=dodaj_el(root,1);  
    root=dodaj_el(root,9);
   pokaz(root); //????????
    
  cout << "\n";
    system("PAUSE");
    return EXIT_SUCCESS;
}

Dzięki za pomoc.

0
printf("           %i              \n",zmienna1);
printf("\n");
printf("        %i      %i         \n",zmienna2,zmienna3);
printf("\n");
printf("    %i    %i  %i   %i       \n",zmienna4,zmienna5,zmienna6,zmienna7);
...
0

Hmm... może ten program pomoże Ci rozwiązać problem. To jest pierwsza wersja, która jest nieco uboga, gdyż można do niej stosunkowo łatwo dodać znaki ASCII, które w ładny sposób połączą wyświetlanie danych. Jeżeli znajdę to podrzucę kod z tymi liniami. Program jest w Pascalu, ale może jednak w czymś pomoże.

program bst;

uses crt ;


type
  drzewo = ^ wezel;
  wezel = record
    elem : integer;
    numer, wysokosc, ilewyz : integer;
    lewo, prawo, gora : drzewo;
  end;

var
  korzen, w : drzewo ; liczba : integer;


procedure wstaw(liczba:integer; n:word; u:drzewo; var w,r:drzewo);
begin
  if r <> nil then
  begin
    if r^.elem = liczba then w := nil
    else
    begin
      if r^.elem < liczba then wstaw(liczba, 2*n+1, r, w, r^.prawo)
      else wstaw(liczba, 2*n, r, w, r^.lewo)
    end;
  end

  else
  begin
    new(r);
    r^.elem:=liczba;
    r^.numer:=n;
    r^.gora:=u;
    r^.lewo:=nil;
    r^.prawo:=nil;
    r^.wysokosc:=0;
    r^.ilewyz:=0;
    w:=u;
    while w<>nil do
    begin
      if w^.lewo = nil then
      begin
        w^.wysokosc := w^.prawo^.wysokosc+1;
        w^.ilewyz := - w^.wysokosc
      end
      else
        if w^.prawo = nil then
        begin
          w^.wysokosc := w^.lewo^.wysokosc+1;
          w^.ilewyz := w^.wysokosc
        end
	else
        if w^.lewo^.wysokosc > w^.prawo^.wysokosc then
        begin
          w^.wysokosc := w^.lewo^.wysokosc+1;
          w^.ilewyz := w^.lewo^.wysokosc - w^.prawo^.wysokosc
        end
	else
        begin
          w^.wysokosc := w^.prawo^.wysokosc+1;
          w^.ilewyz := w^.lewo^.wysokosc - w^.prawo^.wysokosc
        end;
        w:=w^.gora
      end;
      w:=r
   end
end;



procedure rysuj(r : drzewo; x,y,d : Word ) ;
var
  a,b : Byte;

begin
  gotoxy(x, y);
  write(r^.elem);
  a:=0;
  if r^.lewo<>nil then a:=a+1;
  if r^.prawo<>nil then a:=a+2;
  if d>0 then

  case a of
     1: rysuj(r^.lewo, x-1-(d div 2), y+2, d div 2);
     2: rysuj(r^.prawo, x+1+(d div 2), y+2, d div 2);
     3: begin
       rysuj(r^.lewo, x-1-(d DIV 2), y+2, d DIV 2);
       rysuj(r^.prawo, x+1+(d DIV 2), y+2, d DIV 2)
     end;
   end;
end;



begin
  textbackground(blue);
  textcolor(15);
  clrscr;
  korzen:=nil;
  repeat
    gotoxy(15,24);
    write('Wprowadz liczbe, 0 aby zakonczyc: ');
    readln(liczba);
    if (liczba<>0) then
    begin
      clrscr ;
      wstaw(liczba , 1 , nil , w , korzen);
      clrscr ;
      rysuj(korzen , 36 , 2 , 31);
    end
   until (liczba=0);
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1