Gaba ɗaya kallon bishiyar, aiwatarwa da ƙari

Wataƙila mutane da yawa sun yi ƙoƙari su nemo ginin bishiyar gabaɗaya, amma injin binciken ya sami binary kawai ... Bishiyar binciken binary, bishiyar bishiyar bishiyar da sauran algorithms da yawa.
Haka ne, hakika, ba a amfani da bishiyar gabaɗaya a ko'ina, ana tafiya a hankali, lokuta masu amfani suna da ƙananan.

Don haka, na tambayi kaina wannan tambayar kuma yanzu zan bayyana yadda ake gina itacen. Don haka, a zahiri, tsarin bishiyar gabaɗaya yakamata ya adana masu canji guda uku:

  • nuni ga babban dansa
  • nuni ga dan uwa
  • bayanan da zaku adana

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

Bari mu ayyana mai nuni zuwa ga ƙarshen:

Node *tree = NULL;

Dole ne mu yarda da wuri yadda ake shigar da nisa; wannan ba bishiyar binaryar ba ce, kuma kowane gefen yana iya samun yara da yawa kamar yadda ake so.

  • + 2 (ko +ssbb 2) - shigar da bishiya (ga bishiyar gabaɗaya, ana ba da hanya ta hanyar layi, inda r shine ƙirƙirar tushen, s shine canzawa zuwa babban ɗa, b shine sauyi zuwa ga. dan uwa);

Bari in baku misali:

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

Sakamakon zai zama itace kamar haka:

1
  2
    5
  3
    6
    7
  3

Da farko, bari mu ƙirƙiri wani aiki wanda zai ƙara juzu'i, wato, keɓance ƙwaƙwalwar ajiya don jujjuyawar sannan mu wuce mai nuni zuwa wannan ƙarshen (da farko ba a haɗa shi da komai ba).

Node *create_tree(int v) {
  Node *Tree = (Node *) malloc(sizeof(Node));
  Tree->key = v;
  //обнуляем указатели к братьям и сыновьям, независимая вершина, которая хранит value
  Tree->son = NULL;
  Tree->brother = NULL;
  return Tree;
}

Hakanan kuna buƙatar ƙirƙirar aikin da ke sarrafa kirtan hanya (+bs...). Duk lokacin da muka fara tafiya daga tushen, idan ba a halicce shi ba, to muna fitar da NULL (ba za mu iya yin komai ba). Idan babu kishiyar, to dole ne mu ƙirƙira shi. Muna zuwa aikin ƙirƙirar itace kuma mu sami mai nuni ga tushen.

Lura cewa Node *** itace yana wucewa tsarin, ba kwafa shi ba. Wannan yana ba mu ikon canza abubuwan da ba za mu iya yi da Node *bayanar itace ba.

Gabaɗaya, dole ne mu nemo mai nuni zuwa ga ƙarshen abin da muke buƙatar ƙara ɗa:

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

Haka muke gina bishiya.

PS wannan shine labarina na farko, don Allah kar a yi hukunci da tsauri sosai

source: www.habr.com

Add a comment