/* * tree.c * * Created by Yigit Colakoglu on 07/06/2021. * Copyright yigit@yigitcolakoglu.com. 2021. All rights reserved. */ #include "tree.h" #include "linkedlist.h" #include "urlparse.h" #include #include #include extern TreeNode *root; TreeNode *addtree(TreeNode *parent, TreeNode *p) { if (parent == NULL) return p; int strdiff = strcmp(parent->path, p->path); if (!strdiff) { while (p->params != NULL) { if (p->params == NULL || linkedlistfind(parent->params, p->params->data) == -1) { p->params = linkedlistadd(parent->params, p->params->data); } p->params = p->params->next; } } else if (strdiff < 0) { parent->left = addtree(parent->left, p); parent->left->parent = parent; } else { parent->right = addtree(parent->right, p); parent->right->parent = parent; } return parent; } void rotatetreeleft(TreeNode *p) { TreeNode *r = p->right; p->right = r->left; if (p->right) p->right->parent = p; r->parent = p->parent; if (p->parent == NULL) root = r; else if (p->parent->left == p) p->parent->left = r; else p->parent->right = r; r->left = p; p->parent = r; } void rotatetreeright(TreeNode *p) { TreeNode *l = p->left; p->left = l->right; if (p->left) p->left->parent = p; l->parent = p->parent; if (p->parent == NULL) root = l; else if (p->parent->left == p) p->parent->left = l; else p->parent->right = l; l->right = p; p->parent = l; } void balancetree(TreeNode *root, TreeNode *node) { TreeNode *p = NULL; TreeNode *gP = NULL; while (node->parent != NULL && node->parent->parent != NULL && node->red && node->parent->red ) { p = node->parent; gP = node->parent->parent; if (gP->left == p) { if (gP->right != NULL && gP->right->red) { gP->red = 1; gP->left->red = 0; gP->right->red = 0; node = gP; }else{ if(p->right == node){ rotatetreeleft(p); node = p; p = node->parent; }else{ rotatetreeright(gP); int c = p->red; p->red = gP->red; gP->red = c; node = p; } } } else { if(gP->left != NULL && gP->left->red){ gP->red = 1; gP->left->red = 0; gP->right->red = 0; node = gP; }else{ if(p->left == node){ rotatetreeright(p); node = p; p = node->parent; }else{ rotatetreeleft(gP); int c = p->red; p->red = gP->red; gP->red = c; node = p; } } } } root->red = 0; } TreeNode *treealloc(void) { return (TreeNode *)malloc(sizeof(TreeNode)); } void printtree(TreeNode *root, FILE *out, char *payload, int minparams) { if (root != NULL) { printtree(root->left, out, payload, minparams); if(root->nparams >= minparams){ fprintf(out, "%s", root->path); (!root->nparams) ? : fprintf(out, "%c",'?'); linkedlistprint(root->params, out, payload); fprintf(out, "%c", '\n'); } printtree(root->right, out, payload, minparams); } }