我想使用BST实现堆栈(推送和弹出操作)。
在BST中的邮政订单遍历期间,根在迭代中遍历堆栈的顶部。 那么,这是否意味着我必须插入和删除根或其他内容的元素?
答案 0 :(得分:1)
int num=1;
struct node
{
int flag;
int val;
node *left,*right,*parent;
};
node* tree::InorderTraversalusingInBuiltstack()
{
stack<node *> p;
node *current=root;
while(!p.empty()|| current!=NULL)
{
while(current!=NULL)
{
p.push(current);
current=current->left;
}
current=p.top();
if(current->flag==num)
{
return current;
}
p.pop();
current=current->right;
}
}
void tree::StackUsingBST()
{
node *q;
while(root!=NULL)
{
num--;
q=InorderTraversalusingInBuiltqueue();
node *a=q->parent;
if(a!=NULL)
{
if(a->left==q)
a->left=NULL;
else
a->right=NULL;
q->parent=NULL;
delete q;
disp();
cout<<endl;
}
else
{
delete q;
root=NULL;
}
}
}
这里我的方法是通过使用标志变量来修改我的数据结构 作为全局变量;
假设首先插入8然后其对应的标志值为1 然后插入12其标志值= 2 然后插入3其标志值= 3
现在为了使用BST作为堆栈我必须删除最后插入的元素,并根据我的算法具有最高标志值。
另请注意,插入的最后一个元素没有任何子元素,因此删除它非常容易。
为了找到节点可用的最高标志值,我使用堆栈进行了一个inordertraversal,这比它的递归遍历更好。
在找到对应于最高标志值的节点后,我删除该节点。 重复此过程,直到root = NULL。