📅  最后修改于: 2023-12-03 15:23:22.092000             🧑  作者: Mango
二叉搜索树(Binary Search Tree,BST)是一种常见的数据结构,其支持快速的查找、插入和删除操作。而在许多情况下,我们需要遍历BST中的所有元素。实现一个向后迭代器,可以帮助我们按顺序遍历BST中的每一个元素。
在开始讲解向后迭代器的实现之前,我们先来回顾一下BST的基本定义。BST是一种二叉树,其中每个节点的值大于等于左子树中任意节点的值,小于等于右子树中任意节点的值。它的中序遍历结果是一个有序的序列。
向后迭代器是指在有序序列中,从当前位置开始返回下一个元素的迭代器。对于BST来说,向后迭代器就是可以按顺序遍历BST中所有元素的迭代器。
为了实现BST的向后迭代器,我们需要记录BST中前一个被访问的节点。由于BST是有序的,所以当我们访问一个节点时,需要记录这个节点的下一个节点(也就是中序遍历顺序中,这个节点的后继节点)。当我们遍历完这个节点以及其子树后,就可以直接访问记录的后继节点。
下面是一个C++的实现:
class BSTIterator {
public:
BSTIterator(TreeNode* root): current(root) {}
int next() {
while (current != nullptr) {
stack.push(current);
current = current->left;
}
current = stack.top();
stack.pop();
int val = current->val;
current = current->right;
return val;
}
bool hasNext() {
return !stack.empty() || current != nullptr;
}
private:
TreeNode* current;
stack<TreeNode*> stack;
};
在构造函数中,我们将current设置为BST的根节点。在next函数中,我们每次将当前节点及其左子树中的所有节点都压入栈中,直到current为null。这时,栈顶的节点就是中序遍历顺序中的下一个节点(也就是current的后继节点)。我们将栈顶节点弹出,更新current为栈顶节点的右子树,并返回栈顶节点的值。
在hasNext函数中,如果栈不为空或者current不为null,说明还有元素需要遍历,返回true。否则返回false。
BST的向后迭代器实现起来比较简单,只需要记录下一个需要访问的元素即可。这种迭代器可以极大地简化对BST的遍历操作。