解题思路
这道题和二叉树的中序遍历有什么区别呢?它不是注重一个遍历序列,而是一个时刻,我调用next();就给我返回当前这个BST树的最小节点。
那么,和LDR的区别就是,LDR是求所有的节点最终的访问蓄列,因此,next()只是访问这个序列中的某个元素的一次操作。所以,每调用一次next();就能得到BST树中当前结点的最小值,那么我们应该按照BST的特点,将所有的节点按照从大到小的顺序入栈,这样我们就能时刻从栈顶取最小的元素。
而当我们每次取出最小的栈顶元素,我们要将该元素的右分支也按照上述的从大到小的顺序入栈。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct TreeNode Node;
typedef struct {
Node *ndarr[10000];
int top;
int size;
} BSTIterator;
BSTIterator* bSTIteratorCreate(struct TreeNode* root) {
Node *ptmp = root;
if (!ptmp)
{
return NULL;
}
BSTIterator *BSTIter = (BSTIterator *)malloc(sizeof(BSTIterator));
BSTIter->top = BSTIter->size = 0;
while (ptmp)
{
BSTIter->ndarr[BSTIter->top++] = ptmp;
BSTIter->size++;
ptmp = ptmp->left;
}
return BSTIter;
}
bool bSTIteratorHasNext(BSTIterator* obj) {
return obj->size > 0?true:false;
}
int bSTIteratorNext(BSTIterator* obj) {
if (bSTIteratorHasNext(obj) == false)
{
return -1;
}
Node *ptmp = obj->ndarr[obj->top-1];
obj->top--;
obj->size--;
int val = ptmp->val;
ptmp = ptmp->right;
while (ptmp)
{
obj->ndarr[obj->top++] = ptmp;
obj->size++;
ptmp = ptmp->left;
}
return val;
}
void bSTIteratorFree(BSTIterator* obj) {
if (obj)
{
free(obj);
}
return;
}
/**
* Your BSTIterator struct will be instantiated and called as such:
* BSTIterator* obj = bSTIteratorCreate(root);
* int param_1 = bSTIteratorNext(obj);
* bool param_2 = bSTIteratorHasNext(obj);
* bSTIteratorFree(obj);
*/