(1)質問1:341。ネストされたリストイテレータのフラット化
トピック:ネストされた整数のリストは次のとおりです。この整数リスト内のすべての整数をトラバースできるようにイテレータを設計してください。
リスト内の各項目は、整数または別のリストのいずれかです。リストの要素は、整数または他のリストでもかまいません。
1.タイトルはコード内のコメントとして詳細な説明が付けられているため、質問を注意深く読む必要がありますが、英語のコメントであるため、理解がそれほど包括的ではなく、非常に混乱することに注意してください。まず、開始します。
2.しかし、問題をはっきりと見てください。この問題はコンテナクラスNestedIteratorを構築することであり、メイン関数で使用します
。NestedIteratori(nestedList);
初期化メソッドwhile(i.hasNext())cout << i.next( );
3.つまり、入力はnestedListデータであり、ベクタータイプであり、クラス+ベクターの組み合わせがここで使用されます(ベクター内の各データはNestedIntegerタイプです)。必要なことはNestedIteratorです。 (vector&nestedList)この初期化関数は、渡されたベクトル&nestedListのネストされたリストを、ネストされていない通常のリストに変換します。
4.ベクトルには使用できる関数が多数あることに注意してください。ここでは、size()を使用して、dfsの現在のリスト内の要素の数を直接取得します。
5.タイトルのネストされたリストクラスは3つの関数を提供します。1つはboolisInteger()constです。現在のリストの要素が数値であるかどうかを判断するには、int getInteger()const;を使用して値を取得します。それ以外の場合は、const vector&getList()const;を使用して、このネストされたリストを取得できます。
class NestedIterator {
private:
vector<int> integer;
int index=0;
public:
NestedIterator(vector<NestedInteger> &nestedList) {
//在这里初始化
convert(nestedList); //进行转化成本类对象,即拆分嵌套
}
int next() {
return integer[index++];
}
bool hasNext() {
return integer.size()>index;
}
void convert(vector<NestedInteger> &nestedList)
{
for(int i=0;i<nestedList.size();i++) //dfs思想
{
if(nestedList[i].isInteger())
{
integer.push_back(nestedList[i].getInteger());
}
else
{
convert(nestedList[i].getList());
}
}
}
};
/**
* // This is the interface that allows for creating nested lists.
* // You should not implement it, or speculate about its implementation
* class NestedInteger {
* public:
* // Return true if this NestedInteger holds a single integer, rather than a nested list.
* bool isInteger() const;
*
* // Return the single integer that this NestedInteger holds, if it holds a single integer
* // The result is undefined if this NestedInteger holds a nested list
* int getInteger() const;
*
* // Return the nested list that this NestedInteger holds, if it holds a nested list
* // The result is undefined if this NestedInteger holds a single integer
* const vector<NestedInteger> &getList() const;
* };
*/
/**
* Your NestedIterator object will be instantiated and called as such:
* NestedIterator i(nestedList); 初始化的方式
* while (i.hasNext()) cout << i.next();
*/
(2)2番目の質問:94。二分木の順序通りの走査
タイトル:二分木のルートノードルートが与えられた場合、その中次走査を返します。
1.この質問で調べるのは、二分木の中次走査です。実際、一次走査、中次走査、後次走査のいずれであっても、違いは最初に走査するか、最初に走査するかです。最初に出力しますが、これは実際には順序の問題です。この種の問題は、再帰を使用して解決する方が適切です。スタックを使用することもできます。再帰に関しては、スタックを使用できます。
2.しかし、この質問が少し間違っているのは、最初に直接result [index ++] = root-> valを実行することです。このアプローチは不可能です。最初に結果にスペースを割り当てる必要があります。また、必要がない場合は、使用するスペースの割り当て量を格納するときに、ベクトルのpush_back関数を直接呼び出して、ベクトルの最後に挿入できます。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
vector<int> result;
public:
void midtraverse(TreeNode* root)
{
if(root!=nullptr)
{
if(root->left!=nullptr)
midtraverse(root->left);
result.push_back(root->val);
if(root->right!=nullptr)
midtraverse(root->right);
}
}
vector<int> inorderTraversal(TreeNode* root) {
midtraverse(root);
return result;
}
};