173_二叉搜索树迭代器C++

首先是二叉搜索树的建立和操作

/*二叉搜索树 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;
		}
	}
};

你可能感兴趣的:(数据结构,leetcode)