Ниже приведен код для преобразования обхода предзаказов двоичного дерева поиска в исходное дерево.
Следующий код принимает массив целых чисел, которые представляют собой предварительный обход дерева двоичного поиска. Возвращается корень дерева конструкции.
struct Node* constructTree(int pre[], int size)
{
stack<struct Node* > s;
int i;
struct Node* root=newNode(pre[0]);
struct Node* temp;
struct Node* top_node;
s.push(root);
for(i=1;i<size;i++)
{
temp=NULL;
while(!s.empty()&&pre[i]>(s.top()->data))
{
temp=s.top();
s.pop();
}
if(temp==NULL)
{
top_node=s.top();
top_node->left=newNode(pre[i]);
s.push(top_node->left);
}else
{
temp->right=newNode(pre[i]);
s.push(temp->right);
}
}
return root;
}
Источник: http://www.geeksforgeeks.org/construct-bst-from-given-preorder-traversal-set-2/
Мне трудно понять этот код. Может ли кто-нибудь помочь мне понять следующее:
На любой заданной итерации какие значения хранятся в стеке по отношению к текущему значению, указываемому pre[i]
Есть ли другой итеративный метод для построения BST из заданного обхода порядка?
Спасибо.
После итерации, где сконструирован узел, содержащий pre[i]
, стек содержит этот узел сверху, под которым верхний и нижний корневые предки с одним ребенком хранятся сверху вниз.