Zuhaitzaren ikuspegi orokorra, ezarpena eta gehiago

Jende asko saiatu zen ziurrenik zuhaitzaren eraikuntza orokor bat aurkitzen, baina bilatzaileak bitarrak baino ez zituen aurkitu... Bilaketa-zuhaitz bitarra, zuhaitz bitarra zeharkatzea eta beste hainbat algoritmo.
Bai, egia esan, zuhaitz orokorra ez da inon erabiltzen, zeharkaldia motela da, erabilera kasuak txikiak dira.

Beraz, galdera hau egin nion neure buruari eta orain zuhaitza nola eraikitzen den azalduko dut. Beraz, hobe da zuhaitz-egitura orokor batek hiru aldagai gorde beharko lituzke:

  • seme zaharrenaren erakuslea
  • anaiaren erakuslea
  • gordeko dituzun datuak

struct Tnode {
    int key;
    struct Tnode *son;
    struct Tnode *brother;
};
typedef struct Tnode Node;

Adieraz dezagun erpinaren erakuslea:

Node *tree = NULL;

Aldez aurretik adostu behar dugu erpinak nola sartu; hau ez da zuhaitz bitarra, eta erpin bakoitzak nahi adina seme-alaba izan ditzake.

  • + 2 (edo +ssbb 2) - zuhaitz batean txertatzea (zuhaitz orokor baterako, bidea lerroak ematen du, non r erro baten sorrera den, s seme zaharrenaren trantsizioa den, b trantsizio bat den anaia bat);

Adibide bat jartzen dizut:

+r 1
+ 2
+ 3
+ 3
+s 5
+sb 6
+sb 7

Emaitza honelako zuhaitza izango da:

1
  2
    5
  3
    6
    7
  3

Lehenik eta behin, sor dezagun erpin bat gehitzen duen funtzio bat, hots, erpinari memoria esleitzen dion eta erakusle bat pasatzen dion erpin honi (hasieran ez dago ezer lotuta).

Node *create_tree(int v) {
  Node *Tree = (Node *) malloc(sizeof(Node));
  Tree->key = v;
  //обнуляСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΊ Π±Ρ€Π°Ρ‚ΡŒΡΠΌ ΠΈ ΡΡ‹Π½ΠΎΠ²ΡŒΡΠΌ, нСзависимая Π²Π΅Ρ€ΡˆΠΈΠ½Π°, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ value
  Tree->son = NULL;
  Tree->brother = NULL;
  return Tree;
}

Bide-katea (+bs...) kudeatzen duen funtzio bat ere sortu behar duzu. Errotik zeharkatzea hasten dugun bakoitzean, sortzen ez bada, NULL ateratzen dugu (ezin dugu ezer egin). Erpinik ez badago, orduan sortu behar dugu. Sortu zuhaitz funtziora joango gara eta errora erakuslea lortuko dugu.

Kontuan izan Node** zuhaitza egitura pasatzen ari dela, ez kopiatzen. Honek Node *zuhaitz deklarazioarekin egin ezin ditugun gauzak aldatzeko gaitasuna ematen digu.

Oro har, semea gehitu behar diogun erpinaren erakusle bat aurkitu behar dugu:

Node* add_node(Node **tree, const char *a) {
  Node* t = *tree;
  int value;
  scanf("%d", &value);
  int i = 0;
      while (a[++i] != ' ') {
        if (a[i] == 'r') {
            *tree = create_tree(value); // создаСм ΠΊΠΎΡ€Π΅Π½ΡŒ
            t = *tree;
            return *tree;
          }
        if (a[i] == 's') {
          if (t = to_son(t)) // функция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° сына
            continue;
          return NULL; //ΠΈΠ½Π°Ρ‡Π΅ NULL
        }
        if (a[i] == 'b') {
          if (t = to_brother(t)) //Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±Ρ€Π°Ρ‚Π° t 
            continue;
          return NULL;
        }
    }
    if (t->son != NULL) {
    t = last_son(t); // ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ…ΠΎΡ‚Π΅Π»ΠΈ 
   //ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ΄Π΅ΠΌ ΠΊ послСднСму Π΅Π΅ сыну,
   //Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½Π΅Ρ† списка
    t->brother = create_tree(value);
    return t->brother;
    }
    else {//Ссли сына Π½Π΅Ρ‚, Ρ‚ΠΎ создадим Π΅Π³ΠΎ
      t->son = create_tree(value);
      return t->son;
    }
}

Horrela eraikitzen dugu zuhaitz bat.

PS hau da nire lehen artikulua, beraz, mesedez, ez epaitu gogorregi

Iturria: www.habr.com

Gehitu iruzkin berria