1.トピックの説明
二分探索木反復子を実装します。バイナリ検索ツリーのルートノードを使用して、イテレータを初期化します。
next()を呼び出すと、バイナリ検索ツリーで次に小さい数値が返されます。
例:
BSTIterator iterator = new BSTIterator(root);
iterator.next(); // 3を返す
iterator.next(); // 7を返す
iterator.hasNext(); // trueを返す
iterator.next(); //返す9
iterator.hasNext(); // trueを返す
iterator.next(); // 15を返す
iterator.hasNext(); // trueを返す
iterator.next(); // 20を返す
iterator.hasNext(); //返す偽
ヒント:
next()およびhasNext()操作の時間の複雑さはO(1)であり、O(h)メモリーを使用します。ここで、hはツリーの高さです。
next()呼び出しは常に有効であると想定できます。つまり、next()が呼び出されると、BSTには次に小さい番号が少なくとも1つ存在します。
2.私のコード
/ **
-
バイナリツリーノードの定義。
-
構造TreeNode {
-
int val;
-
TreeNode *left;
-
TreeNode *right;
-
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
-
};
/
クラスBSTIterator {
public:
BSTIterator(TreeNode root){
mPRoot = root;
}/ ** @次に小さい数を返す/
int next(){
int val = 0;
TreeNode left_tmp = NULL;
TreeNode * cur_tmp = NULL;
TreeNode * father_tmp = NULL;if(mPRoot->left == NULL){ val = mPRoot->val; mPRoot = mPRoot->right; } else { father_tmp = mPRoot; left_tmp = mPRoot->left; cur_tmp = left_tmp; do { cur_tmp = left_tmp->left; if(cur_tmp != NULL){ father_tmp = left_tmp; left_tmp = cur_tmp; } }while(cur_tmp != NULL); val = left_tmp->val; father_tmp->left = left_tmp->right; } return val;
}
/ ** @n番目に小さい数があるかどうかを返す* /
bool hasNext(){
if(mPRoot == NULL)
return false;
それ以外の
場合はtrueを返します。
}TreeNode * mPRoot;
};
/ **
- BSTIteratorオブジェクトがインスタンス化され、そのように呼び出されます。
- BSTIterator * obj = new BSTIterator(root);
- int param_1 = obj-> next();
- bool param_2 = obj-> hasNext();
* /
3.インターネット上の優れたソリューション
a。データを連続した1次元配列、キューに編成する
b。最初にすべてのデータを処理するのではなく、スタックを使用してランダムポーズ処理を実行する
4.
運用効率と改善できるメモリ占有率は理想的ではありません
5.コードを単純化するように最適化します
/ **
-
バイナリツリーノードの定義。
-
構造TreeNode {
-
int val;
-
TreeNode *left;
-
TreeNode *right;
-
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
-
};
/
クラスBSTIterator {
public:
stack <TreeNode > tree_stack;void INOrderleft(TreeNode * root){
while(root!= NULL){
tree_stack.push(root);
root = root-> left;
};
}
BSTIterator(TreeNode * root){
INOrderleft(root);
}/ ** @次に小さい数を返す/
int next(){
TreeNode cur_tmp = tree_stack.top();
tree_stack.pop();
if(cur_tmp-> right!= NULL){
INOrderleft(cur_tmp-> right);
}
return cur_tmp-> val;
}/ ** @次に小さい数値があるかどうかを返す* /
bool hasNext(){
int size = tree_stack.size();
if(size> 0)は
trueを返します。
それ以外の場合は
falseを返します。
}
};
/ **
- BSTIteratorオブジェクトがインスタンス化され、そのように呼び出されます。
- BSTIterator * obj = new BSTIterator(root);
- int param_1 = obj-> next();
- bool param_2 = obj-> hasNext();
* /
6.
STLによって提供されるツールについて考えることを使用する必要があります。