LeetCode上的写一个二叉查找树的由小到大顺序的迭代器
2015-04-11 16:08
113 查看
题目:
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.
Calling
Note:
思路及实现:
#include<iostream>
#include<stack>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL),right(NULL) {}
};
/*
BST是二叉查找数,左子数上的元素都小于根节点,右子数上的元素大于根节点
按照左子树,根,右子树的次序,就是一个从小到大的顺序
*/
class BSTIterator
{
public:
BSTIterator(TreeNode *root)
{
TreeNode* pCurNode = root;
while(pCurNode)
{
nodeStack.push(pCurNode);
pCurNode = pCurNode->left;
}
}
bool hasNext()
{
//栈空表示没有节点要访问了
return !nodeStack.empty();
}
int next()
{
//每次进next()的时候,都保证当前节点是最左下,则其左子树已经没有节点了
TreeNode* pCurNode = nodeStack.top();
int value = pCurNode->val;
//保存完右子树,弹出当前节点,
pCurNode = pCurNode->right;
nodeStack.pop();
//如果右子树不为空,将其沿左下方的所有节点依次加入栈
while(pCurNode != NULL)
{
nodeStack.push(pCurNode);
pCurNode = pCurNode->left;
}
return value;
}
private:
stack<TreeNode*> nodeStack;
};
int main(int argc, char** argv)
{
TreeNode* node6 = new TreeNode(6);
TreeNode* node3 = new TreeNode(3);
TreeNode* node9 = new TreeNode(9);
TreeNode* node2 = new TreeNode(2);
TreeNode* node5 = new TreeNode(5);
TreeNode* node7 = new TreeNode(7);
TreeNode* node11 = new TreeNode(11);
TreeNode* node13 = new TreeNode(13);
node6->left = node3;
node6->right = node9;
node3->left = node2;
node3->right = node5;
node9->left = node7;
node9->right = node11;
node11->right = node13;
BSTIterator iter = BSTIterator(node6);
while( iter.hasNext())
{
cout << iter.next() << endl;
}
}
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.
Calling
next()will return the next smallest number in the BST.
Note:
next()and
hasNext()should run in average O(1) time and uses O(h) memory, whereh is the height of the tree.
思路及实现:
#include<iostream>
#include<stack>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL),right(NULL) {}
};
/*
BST是二叉查找数,左子数上的元素都小于根节点,右子数上的元素大于根节点
按照左子树,根,右子树的次序,就是一个从小到大的顺序
*/
class BSTIterator
{
public:
BSTIterator(TreeNode *root)
{
TreeNode* pCurNode = root;
while(pCurNode)
{
nodeStack.push(pCurNode);
pCurNode = pCurNode->left;
}
}
bool hasNext()
{
//栈空表示没有节点要访问了
return !nodeStack.empty();
}
int next()
{
//每次进next()的时候,都保证当前节点是最左下,则其左子树已经没有节点了
TreeNode* pCurNode = nodeStack.top();
int value = pCurNode->val;
//保存完右子树,弹出当前节点,
pCurNode = pCurNode->right;
nodeStack.pop();
//如果右子树不为空,将其沿左下方的所有节点依次加入栈
while(pCurNode != NULL)
{
nodeStack.push(pCurNode);
pCurNode = pCurNode->left;
}
return value;
}
private:
stack<TreeNode*> nodeStack;
};
int main(int argc, char** argv)
{
TreeNode* node6 = new TreeNode(6);
TreeNode* node3 = new TreeNode(3);
TreeNode* node9 = new TreeNode(9);
TreeNode* node2 = new TreeNode(2);
TreeNode* node5 = new TreeNode(5);
TreeNode* node7 = new TreeNode(7);
TreeNode* node11 = new TreeNode(11);
TreeNode* node13 = new TreeNode(13);
node6->left = node3;
node6->right = node9;
node3->left = node2;
node3->right = node5;
node9->left = node7;
node9->right = node11;
node11->right = node13;
BSTIterator iter = BSTIterator(node6);
while( iter.hasNext())
{
cout << iter.next() << endl;
}
}
相关文章推荐
- 用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出
- ⑴输入10个职工的姓名和职工号;⑵按职工号由小到大排序,姓名顺序也随之调整;⑶要求输入一个职工号,查找法找出该职工的姓名。从主函数输入要查找的职工号,输出该职工姓名
- leetcode第一题 将一个字符串的单词顺序反转输出
- 习题 7.11 写一个函数,用“起泡法”对输入的10个字符按由小到大顺序排列。
- 写一个函数,用“起泡法”对输入的10个字符按由小到大的顺序排列
- 编写一个程序,自定义以为数组,删除一维数组中所有相同的数,使之只剩一个。数组中的数按由小到大顺序排列,并显示运行所用时间。
- 每天一道LeetCode-----重排链表,节点顺序是从头取一个,从尾取一个,从头取一个,从尾取一个.....
- 字符串数组 输入3个字符串,要求按由小到大的字母顺序输出; 输入n个学生的姓名和学号到字符串数组中,在输入一个姓名,如果班级有该生则返回其信息,否则返回本班无此人
- 将一个英文句子单词顺序逆置(LeetCode | Reverse Words in a String)
- 每天一道LeetCode-----找到一个字符串在另一个字符串出现的位置,字符串内部顺序无要求
- ORACLE中ROWNUM的排序技巧,增加一个顺序栏位
- 把一个整数按大小顺序插入已排好序的数组中
- 当WHERE子句、GROUP BY子句和HAVING子句同时出现在一个查询中时,SQL的执行顺序
- 技术总结:关于JS执行前台和后台顺序的.另外一个是前后和后台变量的交互的.
- 按由小到大顺序排列并输出 用C语言写 希望高手帮忙 由键盘输入10数
- 用vbs实现按创建日期的顺序列出一个文件夹中的所有文件
- 如何打乱一个数组的顺序
- 两个栈共用一个顺序存储空间的代码
- 通过AEC解读WF的核心原理(五)实现一个从下向上执行的顺序容器
- STL顺序容器迭代器何时失效