首先是二叉搜索树的建立和操作
/*二叉搜索树 binary searching tree*/
class BST {
public:
BST() :root(NULL) {}
void buildBST(vector<int> nums);
void printBST();
TreeNode* root;
private:
void insert(TreeNode* &root, int x);//第一个参数为引用
void inorderRecur(TreeNode* root);//递归中序遍历
};
void BST::insert(TreeNode* &node, int x)
{
if (node == NULL)
{
node = new TreeNode(x);
}
else
{
if (x < node->val)//左子树递归
{
insert(node->left, x);
}
else//右子树递归
{
insert(node->right, x);
}
}
}
void BST::buildBST(vector<int> nums)
{
for (vector<int>::iterator iter = nums.begin(); iter != nums.end(); ++iter)
{
insert(root, *iter);
}
}
void BST::inorderRecur(TreeNode* root)
{
if (root == NULL)
return;
inorderRecur(root->left);
cout << root->val << " ";
inorderRecur(root->right);
}
void BST::printBST()
{
inorderRecur(root);
}
方法一:用一个队列存储中序遍历的节点。每次调用next函数时,弹出队列第一个元素并返回
class BSTIterator {
public:
BSTIterator(TreeNode* root) {
inorder(root);
}
/** @return the next smallest number */
int next() {
int number = (q.front())->val;
q.pop();
return number;
}
/** @return whether we have a next smallest number */
bool hasNext() {
if (!q.empty())
return true;
else
return false;
}
private:
queue<TreeNode*> q;
void inorder(TreeNode* &root)
{
if (root == NULL)
return;
inorder(root->left);
q.push(root);
inorder(root->right);
}
};
方法二:但是方法一是较为累赘的。其实我们可以在中序遍历的同时输出最小节点值。为了能控制中序遍历,使用非递归的栈存储节点,并用函数next控制遍历过程。可将方法一的空间复杂度O(N)降低到O(h)(h为树的高度)
class BSTIterator {
public:
BSTIterator(TreeNode* root)
{
inorderleft(root);
}
/** @return the next smallest number */
int next() {//进行完中序遍历的后一部分
TreeNode* node = s.top();
s.pop();
int number = node->val;
if (node->right)
{
inorderleft(node->right);
}
return number;
}
/** @return whether we have a next smallest number */
bool hasNext() {
if (!s.empty())
return true;
else
return false;
}
private:
stack<TreeNode*> s;
void inorderleft(TreeNode* &root)//中序递归的第一部分,不断压入左子树,保证栈顶为最小值
{
while (root)
{
s.push(root);
root = root->left;
}
}
};