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

本文介绍两种二叉搜索树迭代器的实现方法。方法一是利用队列进行中序遍历,方法二是通过非递归的栈来控制中序遍历,空间复杂度更优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

/*二叉搜索树 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;
		}
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值