Ejemplo n.º 1
0
Tree* TreeMin(Tree* tree)
{
  if ( tree && tree->left )
    return TreeMin(tree->left);
  else
    return tree;
}
Ejemplo n.º 2
0
static void TreeDoDelete(Tree* toDelete)
{
  if ( toDelete->left && toDelete->right )
  {
    Tree* minTree = TreeMin(toDelete->right);
    toDelete->data = minTree->data;
    TreeDoDelete(minTree);
  }
  else if ( toDelete->left )
  {
    toDelete->data = toDelete->left->data;
    TreeDestroy(toDelete->left);
  }
  else if ( toDelete->right )
  {
    toDelete->data = toDelete->right->data;
    TreeDestroy(toDelete->right);
  }
  else
  {
    if ( toDelete->parent )
    {
      if ( toDelete->parent->left == toDelete )
        toDelete->parent->left = NULL;
      else if ( toDelete->parent->right == toDelete )
        toDelete->parent->right = NULL;
    }
    TreeDestroy(toDelete);
  }
}
Ejemplo n.º 3
0
TreeNode* AVLTree::TreeSuccesor(TreeNode* x)
{
	//если есть правое поддерево, то следующий элемент - это минимальный в поддереве
	if (x->right != NULL) 
	{
		return TreeMin(x->right);
	}

	TreeNode* y = x->parent;
	//пока есть родитель и пока мы в правом поддереве родителя
	while ((y != NULL) && (x == y->right))
	{
		x = y;
		y = y->parent;
	}
	//как только мы оказываемся в левом поддереве родителя, то возвращаем родителя
	return y;
}
Ejemplo n.º 4
0
TreeNode* AVLTree::TreeMin()
{
	return TreeMin(root);
}