设计题——二叉搜索树迭代器
关键思路:以空间换时间,先使用递归的方式,对二叉搜索树进行遍历,获取中序遍历的全部结果并保存在数组中。然后再在得到的数组本身来实现迭代器。
代码:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
typedef struct {
int* res;
int size;
int idx;
} BSTIterator;
int getTreeSize(struct TreeNode* root) {
if (root == NULL) {
return 0;
}
return 1 + getTreeSize(root->left) + getTreeSize(root->right);
}
void inorder(int* ret, int* retSize, struct TreeNode* root) {
if (root == NULL) {
return;
}
inorder(ret, retSize, root->left);
ret[(*retSize)++] = root->val;
inorder(ret, retSize, root->right);
}
int* inorderTraversal(int* retSize, struct TreeNode* root) {
*retSize = 0;
int* ret = (int*)malloc(sizeof(int) * getTreeSize(root));
inorder(ret, retSize, root);
return ret;
}
BSTIterator* bSTIteratorCreate(struct TreeNode* root) {
BSTIterator* obj = (BSTIterator*)malloc(sizeof(BSTIterator));
obj->res = inorderTraversal(&(obj->size), root);
obj->idx = 0;
return obj;
}
int bSTIteratorNext(BSTIterator* obj) {
return obj->res[(obj->idx)++];
}
bool bSTIteratorHasNext(BSTIterator* obj) {
return (obj->idx < obj->size);
}
void bSTIteratorFree(BSTIterator* obj) {
free(obj->res);
free(obj);
}