Likou ----- 1日に2つの質問

(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;
    }
};

おすすめ

転載: blog.csdn.net/qq_43978754/article/details/115111772