Ny fijery ankapobeny ny hazo, ny fampiharana sy ny maro hafa

Betsaka ny olona no niezaka nitady fanamboarana hazo ankapobe, fa ny milina fikarohana dia tsy nahita afa-tsy ny binary... Hazo fikarohana binary, traversal hazo binary ary algorithms maro hafa.
Eny tokoa, ny hazo ankapobeny dia tsy ampiasaina na aiza na aiza, ny fandehanana miadana, ny fampiasana dia kely.

Noho izany, nanontany ny tenako ity fanontaniana ity aho ary ankehitriny dia hanazava ny fomba fananganana ilay hazo aho. Noho izany, ny tsara indrindra, ny firafitry ny hazo amin'ny ankapobeny dia tokony hitahiry karazany telo:

  • fanondro ny lahimatoa
  • tondro ho rahalahy
  • ny data hotehirizinao

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

Andao hanambara tondro mankany amin'ny vertex:

Node *tree = NULL;

Tsy maintsy manaiky mialoha ny fomba hidirana amin'ny vertices isika; tsy hazo binary io, ary ny vertex tsirairay dia afaka manan-janaka maro araka izay irina.

  • + 2 (na +ssbb 2) - fampidirana ao anaty hazo (ho an'ny hazo ankapobe, ny lalana dia omena amin'ny alΓ lan'ny tsipika, izay r dia ny famoronana faka, s dia fifindrana mankany amin'ny lahimatoa, b dia fifindrana mankany rahalahy);

MamelΓ  ahy hanome ohatra anao:

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

Ny vokatra dia ho hazo toy izao:

1
  2
    5
  3
    6
    7
  3

Voalohany, andeha isika hamorona fiasa izay manampy vertex, izany hoe, manome fahatsiarovana ho an'ny vertex ary mandefa tondro mankany amin'io vertex io (tsy mifandray amin'ny zavatra rehetra tamin'ny voalohany).

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

Mila mamorona fiasa izay mitantana ny tadin-dalana (+bs...) ihany koa ianao. Isaky ny manomboka ny traversal avy amin'ny fakany isika, raha tsy noforonina, dia mamoaka NULL (tsy afaka manao na inona na inona isika). Raha tsy misy vertex dia tsy maintsy mamorona azy isika. Mandehana any amin'ny asa famoronana hazo isika ary maka tondro mankany amin'ny fakany.

Mariho fa mandalo ny rafitra ny hazo Node** fa tsy mandika azy io. Izany dia manome antsika fahafahana hanova zavatra izay tsy azontsika atao amin'ny fanambarana hazo Node *.

Amin'ny ankapobeny dia tsy maintsy mahita tondro mankany amin'ny vertex izay ilaintsika ampiana ny zanaka:

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;
    }
}

Toy izao ny fomba fanamboarana hazo.

P.S. ny lahatsoratro voalohany, ka aza mitsara mafy loatra

Source: www.habr.com

Add a comment