bool TreeBalance(TreeElem *Tree)
{
	if (Tree != NULL)
	{
		bool res = (abs(TreeDepth(Tree->LeftSon) - TreeDepth(Tree->RightSon)) <= 1);
		return res && TreeBalance(Tree->LeftSon) && TreeBalance(Tree->RightSon);
	}
	else
		return true;
}
Esempio n. 2
0
/* TreeTraverseAndDelete -- traverse a tree while deleting nodes 
 *
 * The visitor function must return TRUE to delete the current node,
 * or FALSE to keep it.
 *
 * See <design/arena/#chunk.delete.tricky>.
 */
void TreeTraverseAndDelete(Tree *treeIO, TreeVisitor visitor,
                           void *closureP, Size closureS)
{
  Tree *treeref = treeIO;

  AVER(treeIO != NULL);
  AVERT(Tree, *treeIO);
  AVER(FUNCHECK(visitor));
  /* closureP and closureS are arbitrary */

  TreeToVine(treeIO);

  while (*treeref != TreeEMPTY) {
    Tree tree = *treeref;         /* Current node. */
    Tree *nextref = &tree->right; /* Location of pointer to next node. */
    Tree next = *nextref;         /* Next node. */
    if ((*visitor)(tree, closureP, closureS)) {
      /* Delete current node. */
      *treeref = next;
    } else {
      /* Keep current node. */
      treeref = nextref;
    }
  }
  TreeBalance(treeIO);
}
Esempio n. 3
0
void AVLTree::CorrectDeleteBalance(TreeNode* x)
{
	// TreeBalance возвращает указатель на корень поворота
	if ((x->balance == 2) || (x->balance == -2)) x = TreeBalance(x);

	//баланс x уже поправлен, поправляем всех предков, пока 
	while ((x->balance != 1) && (x->balance != -1) && (x->parent != NULL))
	{
		//если удален слева
		if (x == x->parent->left) x->parent->balance--;
		//если удален справа
		else x->parent->balance++;

		if ((x->parent->balance == 2) || (x->parent->balance == -2)) 
		{
			x = TreeBalance(x->parent);
			continue;
		}

		//на уровень выше
		if (x->parent != NULL) x = x->parent;
	}
}
Esempio n. 4
0
void AVLTree::CorrectInsertBalance(TreeNode* x)
{
	//баланс x уже поправлен
	while ((x->balance != 0) && (x->balance != 2) && (x->balance != -2) && (x->parent != NULL))
	{
		//если x - левый узел
		if (x == x->parent->left) 
			x->parent->balance++;
		//если x - правый узел
		else 
			x->parent->balance--;
		x = x->parent;
	}
	if ((x->balance == 2) || (x->balance == -2)) TreeBalance(x);
}
bool BinnaryTree::BalancedTree(void)
{ 
	return TreeBalance(Head);
}