Если мы выполняем обход в порядке, то мы посещаем левое поддерево, затем корневой узел и, наконец, правое поддерево для каждого узла в дереве.Выполнение обхода по порядку даст нам ключи двоичного дерева поиска в порядке возрастания, поэтому, когда мы ссылаемся на получение преемника по порядку узла, принадлежащего к бинарному дереву поиска, мы имеем в виду, каким будет следующий узел в последовательности изданный узел.
Допустим, у нас есть узел R, и мы хотим, чтобы он был преемником по порядку. У нас будут следующие случаи.
[1] Корень R имеетправый узел, поэтому все, что нам нужно сделать, это пройти к самому левому узлу R-> right.
[2] Корень R не имеет правого узла, в этом случаемы перемещаемся вверх по дереву, следуя родительским ссылкам, пока узел R не станет левым потомком своего родителя, когда это происходит, мы имеем родительский узел P в качестве преемника в порядке.
[3] Мы находимся в крайнем правом узле дерева, в этом случае преемника по порядку нет.
Реализация основана на следующем определении узла
class node
{
private:
node* left;
node* right;
node* parent
int data;
public:
//public interface not shown, these are just setters and getters
.......
};
//go up the tree until we have our root node a left child of its parent
node* getParent(node* root)
{
if(root->parent == NULL)
return NULL;
if(root->parent->left == root)
return root->parent;
else
return getParent(root->parent);
}
node* getLeftMostNode(node* root)
{
if(root == NULL)
return NULL;
node* left = getLeftMostNode(root->left);
if(left)
return left;
return root;
}
//return the in order successor if there is one.
//parameters - root, the node whose in order successor we are 'searching' for
node* getInOrderSucc(node* root)
{
//no tree, therefore no successor
if(root == NULL)
return NULL;
//if we have a right tree, get its left most node
if(root->right)
return getLeftMostNode(root->right);
else
//bubble up so the root node becomes the left child of its
//parent, the parent will be the inorder successor.
return getParent(root);
}