예제 #1
0
    ListNode* mergeList(ListNode* l1, ListNode* l2) {
        if (!l1)
            return l2;
        else if (!l2)
            return l1;
        ListNode* result = new ListNode(-1);
        ListNode* last = result;
        
        while (l1 && l2) {
            if (l1->val < l2->val)
                adjustNode(last, l1);
            else
                adjustNode(last, l2);
        }
        
        while (l1)
            adjustNode(last, l1);
        while (l2) 
            adjustNode(last, l2);

        last->next = NULL;
        last = result;
        result = result->next;
        delete last;
        return result;
    }
예제 #2
0
int delValFromNode(long long int val, struct btreeNode *myNode) {
      int pos, flag = 0;
      if (myNode) {
              if (val < myNode->val[1]) {
                      pos = 0;
                      flag = 0;
              } else {
                      for (pos = myNode->count;
                              (val < myNode->val[pos] && pos > 1); pos--);
                       if (val == myNode->val[pos]) {
                              flag = 1;
                      } else {
                              flag = 0;
                      }
              }
              if (flag) {
                      if (myNode->link[pos - 1]) {
                              copySuccessor(myNode, pos);
                              flag = delValFromNode(myNode->val[pos], myNode->link[pos]);
                              if (flag == 0) {
                                      printf("Dado não encontrado na árvore\n");
                              }
                      } else {
                              removeVal(myNode, pos);
                      }
              } else {
                      flag = delValFromNode(val, myNode->link[pos]);
              }
              if (myNode->link[pos]) {
                      if (myNode->link[pos]->count < MIN)
                              adjustNode(myNode, pos);
              }
      }
      return flag;
}
예제 #3
0
파일: b-tree.c 프로젝트: nicoede/FinalPra
/* delete val from the node */
int delValFromNode(int val, struct btreeNode *myNode) {
      int pos, flag = 0;
      if (myNode) {
              if (val < myNode->val[1]) {
                      pos = 0;
                      flag = 0;
              } else {
                      for (pos = myNode->count;
                              (val < myNode->val[pos] && pos > 1); pos--);
                       if (val == myNode->val[pos]) {
                              flag = 1;
                      } else {
                              flag = 0;
                      }
              }
              if (flag) {
                      if (myNode->link[pos - 1]) {
                              copySuccessor(myNode, pos);
                              flag = delValFromNode(myNode->val[pos], myNode->link[pos]);
                              if (flag == 0) {
                                      printf("Given data is not present in B-Tree\n");
                              }
                      } else {
                              removeVal(myNode, pos);
                      }
              } else {
                      flag = delValFromNode(val, myNode->link[pos]);
              }
              if (myNode->link[pos]) {
                      if (myNode->link[pos]->count < MIN)
                              adjustNode(myNode, pos);
              }
      }
      return flag;
}
예제 #4
0
static void _deleteKey(BSTree* tree, BSNode* node, int key, int m)
{
	int i, min = (int)ceil((float)m/2) - 1;
	for(i = 1; i <= node->keyNum; ++i) {
		if (node->keys[i] > key) {
			node->keys[i-1] = node->keys[i];
			node->values[i-1] = node->values[i];
		}
	}
	node->keyNum -= 1;
	if (node->keyNum < min)
		adjustNode(tree, node);
}
예제 #5
0
static void adjustNode(BSTree* tree, BSNode* node)
{
	if (node->parent == NULL) {
		if (node->keyNum == 0) {
			free(node);
			tree->root = NULL;
		}
		return;
	}
	int index = indexNode(node);
	int i, min = (int)ceil((float)tree->mOrder/2) - 1;
	BSNode *right = NULL, *left = NULL, *p = node->parent;
	int keyIndex;
	if (index + 1 <= p->keyNum)
		right = p->children[index + 1];
	if (index >= 1)
		left = p->children[index - 1];
	//borrow from right
	if (right && right->keyNum > min) {
		keyIndex = index + 1;
		node->values[node->keyNum+1] = p->values[keyIndex];
		node->keys[node->keyNum+1] = p->keys[keyIndex];
		if (right->children[0]) {
			node->children[node->keyNum+1] = right->children[0];
			right->children[0]->parent = node;
		}
		p->keys[keyIndex] = right->keys[1];
		p->values[keyIndex] = right->values[1];
		right->children[0] = right->children[1];
		for(i = 2;i <= right->keyNum; ++i) {
			right->keys[i-1] = right->keys[i];
			right->values[i-1] = right->values[i];
			right->children[i-1] = right->children[i];
		}
		right->keyNum -= 1;
		node->keyNum += 1;
		return;
	}
	//borrow from left
	if (left && left->keyNum > min) {
		keyIndex = index;
		for(i = node->keyNum; i > 0; --i) {
			node->keys[i+1] = node->keys[i];
			node->values[i+1] = node->values[i];
			node->children[i+1] = node->children[i];
		}
		node->children[1] = node->children[0];
		node->values[1] = p->values[keyIndex];
		node->keys[1] = p->keys[keyIndex];
		if (left->children[left->keyNum]) {
			node->children[0] = left->children[left->keyNum];
			node->children[0]->parent = node;
		}
		p->keys[keyIndex] = left->keys[left->keyNum];
		p->values[keyIndex] = left->values[left->keyNum];
		left->keyNum -= 1;
		node->keyNum += 1;
		return;
	}
	//merge parent with right
	if (right) { //right has more than one keys.
		keyIndex = index + 1;
		int j = node->keyNum + 1;
		node->keys[j] = p->keys[keyIndex];
		node->values[j] = p->values[keyIndex];
		for(i = keyIndex +1; i <= p->keyNum; ++i) {
			p->keys[i-1] = p->keys[i];
			p->values[i-1] = p->values[i];
			p->children[i-1] = p->children[i];
		}
		j++;
		for(i = 1; i <= right->keyNum; ++i) {
			node->keys[j] = right->keys[i];
			node->values[j] = right->values[i];
			node->children[j-1] = right->children[i-1];
			if (node->children[j-1])
				node->children[j-1]->parent = node;
			j++;
		}
		node->children[j-1] = right->children[i-1];
		if (node->children[j-1])
			node->children[j-1]->parent = node;
		free(right);
		p->keyNum -= 1;
		node->keyNum = j - 1;
		if (p == tree->root && p->keyNum == 0) {
			tree->root = node;
			free(p);
			return;
		}
		if (p->keyNum < min)
			adjustNode(tree, p);
		return;
	}
	//merge parent with left
	keyIndex = index;
	left->keys[left->keyNum+1] = p->keys[keyIndex];
	left->values[left->keyNum+1] = p->values[keyIndex];
	for(i = keyIndex +1; i <= p->keyNum; ++i) {
		p->keys[i-1] = p->keys[i];
		p->values[i-1] = p->values[i];
		p->children[i-1] = p->children[i];
	}
	left->keyNum +=1;
	p->keyNum -= 1;
	free(node);
	if (p == tree->root) {
		tree->root = left;
		free(p);
		return;
	}
	if (p->keyNum < min)
		adjustNode(tree, p);
}