Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //это код как бы для c++, но он использует синтаксис си, поэтому тут есть этот дурацкий define nullptr null
- //короче это просто сишный кодик
- #include "stdio.h"
- #include <stdlib.h>
- #define nullptr NULL
- struct tree {
- int data;
- struct tree *left;
- struct tree *right;
- };
- struct tree *createNode(int rootNode)
- {
- struct tree *head = malloc(sizeof (struct tree));
- head->left = nullptr; // = null, но это эволюция
- head->right = nullptr;
- head->data = rootNode;
- return head;
- }
- void addNode (struct tree *head, int data)
- {
- if (data < head->data){
- if (head->left != nullptr){
- addNode(head->left, data);
- } else {
- struct tree *node = createNode(data);
- head->left = node;
- // node->data = data;
- }
- } else if (data >= head->data) {
- if (head->right != nullptr){
- addNode(head->right, data);
- } else {
- struct tree *node = createNode(data);
- head->right = node;
- //node->data = data;
- }
- }
- }
- void freeTree (struct tree *head){
- if (head != nullptr){
- freeTree(head->right);
- freeTree(head->left);
- free(head);
- }
- }
- void print(struct tree *head, long n)
- {
- long i;
- if (head)
- {
- print(head->right, n+5);
- for (i = 0; i < n; i++)
- printf(" ");
- printf("%d\n", head->data);
- print(head->left, n+5);
- }
- }
- void fromUptoDown (struct tree *head){
- if (head != nullptr){
- printf("%d ", head->data);
- fromUptoDown(head->left);
- fromUptoDown(head->right);
- }
- }
- void fromDowntoUp (struct tree *head){
- if (head != nullptr){
- fromDowntoUp(head->left);
- fromDowntoUp(head->right);
- printf("%d ", head->data);
- }
- }
- void fromLeftToRight (struct tree *head){
- if (head != nullptr){
- fromLeftToRight(head->left);
- printf("%d ", head->data);
- fromLeftToRight(head->right);
- }
- }
- void rightThreadedInorder(struct tree *head) {
- struct tree *current = head;
- struct tree *prev = nullptr;
- while (current != nullptr) {
- if (current->left == nullptr) {
- printf("%d -> ", current->data);
- current = current->right;
- } else {
- prev = current->left;
- while (prev->right != nullptr && prev->right != current) {
- prev = prev->right;
- }
- if (prev->right == nullptr) {
- prev->right = current;
- current = current->left;
- } else {
- prev->right = nullptr;
- printf("%d -> ", current->data);
- current = current->right;
- }
- }
- }
- printf("%d", 50);
- }
- int main() {
- struct tree *head = createNode(50);
- addNode(head, 40);
- addNode(head, 30);
- addNode(head, 45);
- addNode(head, 60);
- addNode(head, 55);
- addNode(head, 70);
- print(head, 0);
- printf("%s", "Top-to-bottom bypass: ");
- fromUptoDown(head); // сверху вниз
- printf("%s", "\nBottom-to-top bypass: ");
- fromDowntoUp(head); // снизу вверх
- printf("%s", "\nLeft-to-right bypass: ");
- fromLeftToRight(head); // слева направо
- printf("%s", "\nFlashing: ");
- rightThreadedInorder(head);
- freeTree(head);
- return 0;
- }
- /*
- построить дерево двоичного поиска, вывести его на экран
- выполнить 3 полных обхода (вывести на экран), симметричную правую прошивку (вывести ее на экран)
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement