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; }
/* 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); }
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; } }
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); }