バイナリツリー(トラバース配列、スタック、従来の溶液)上下逆さまに印刷32 I. II.III [安全-Offerを証明]

1.ソースのタイトル

リンク:バイナリツリーの下逆さまに印刷I.
出典:LeetCode--「安全-Offerを証明する」特別

リンク:IIは、バイナリII上下逆さまに印刷。
出典:LeetCode--「安全-Offerを証明する」特別

リンク:III。バイナリIII上下逆さまに印刷
LeetCode--「安全-Offerを証明する」特別:ソース

0002タイトル

ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明

ヒント:

  • 节点总数 <= 1000

3.解決のタイトル

一つの問題:.私は上から下へ、バイナリツリーを印刷します

方法:子会社キュートラバーサルシーケンス+ +一般的な方法

補助キューを使用して明らかにバイナリツリートラバーサルシーケンス、。まず、チームへの最初のノードが開始しwhile、サイクル、その後、空のキューキュー要素のヘッドは周りの子供たちをデキューエンキューする要素、および要素push_backvectorキューがループ終了を空の場合、すなわち、すべてのノードのバイナリツリートラバーサルが完了します。

以下のコードを参照してください。

// 执行用时 :4 ms, 在所有 C++ 提交中击败了87.08%的用户
// 内存消耗 :14.5 MB, 在所有 C++ 提交中击败了100.00%的用户

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {
        vector<int> vt;
        if (root == nullptr) return vt;
        queue<TreeNode*> q;
        TreeNode* cur;
        q.push(root);
        while (!q.empty()) {
            for (int i = 0; i < q.size(); ++i) {
                cur = q.front();
                vt.push_back(cur->val);
                q.pop();
                if (cur->left) q.push(cur->left);
                if (cur->right) q.push(cur->right);
            }
        }
        return vt;
    }
};

質問2:IIは、バイナリII上下逆さまに印刷。

方法:子会社キュートラバーサルシーケンス+ +一般的な方法

この問題は、問題本質的バイナリツリートラバーサル順序であるが、出力結果の変化の形態を有し、問題が返される必要があるvector<vector<int>>、すなわち、バイナリデータに各層vector<int>二次元で、次にvector要素を追加行に行きます。コードではほとんど変化が可能。変更位置は、コードにマークされています。

以下のコードを参照してください。

// 执行用时 :4 ms, 在所有 C++ 提交中击败了90.01%的用户
// 内存消耗 :15.1 MB, 在所有 C++ 提交中击败了100.00%的用户

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if (!root) return res;
        vector<int> vt;
        queue<TreeNode*> q;   
        TreeNode* cur;
        int len = 1;
        q.push(root);
        while (!q.empty()) {
            for (int i = 0; i < len; ++i) { 
                cur = q.front();
                vt.push_back(cur -> val);
                q.pop();
                if (cur->left) q.push(cur -> left);
                if (cur->right) q.push(cur->right);
            }
            res.push_back(vt);			// 改动点
            vt.clear();					// 改动点
            len = q.size();
        }
        return res;
    }
};

質問3 :. IIIバイナリIII上下逆さまに印刷

方法:子会社キュートラバーサルシーケンス+ + +層のパリティフラグ一般的な方法

トラバーサル配列変異体は、明らかに見出すことができる:二分木のルートノードを設定し、最初の層である、すべてのシーケンスの連続偶数層は、元の配列とは逆です。ここだけのマークを作るために、さえ層のvectorシーケンスは、シーケンスを行うreverse()ことができます。

以下のコードを参照してください。

// 执行用时 :4 ms, 在所有 C++ 提交中击败了86.05%的用户
// 内存消耗 :15.1 MB, 在所有 C++ 提交中击败了100.00%的用户

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if (!root) return res;
        vector<int> vt;
        queue<TreeNode*> q;   
        TreeNode* cur;
        int len = 1, cnt = 1;
        q.push(root);
        while (!q.empty()) {
            for (int i = 0; i < len; ++i) { 
                cur = q.front();
                vt.push_back(cur -> val);
                q.pop();
                if (cur->left) q.push(cur -> left);
                if (cur->right) q.push(cur->right);
            }
            if (cnt % 2 == 0) reverse(vt.begin(), vt.end());	// 注意点
            res.push_back(vt);
            vt.clear();
            len = q.size();
            ++cnt;
        }
        
        return res;
    }
};

方法2:二デュアルスタック層行きがけ+ +一般的な方法

質量データ、存在する場合、問題の方法は、遭遇reverse()また、低速動作とは、技術的な内容を欠いています。これは、中に「安全-Offerを証明するために」を与える辅助双栈の解決策:

  • まず、二つの補助スタックs1、s2
  • 今、バイナリツリーのルート・スタックs1、私たちは、1層目のルートノードを設定します
  • s1スタック内のルート、スタックの第二層(偶数層)と、この時のニーズのデータs2、スタック方法再び左の子と右の子には、これはスタック順序と同じ層が左右にあることを保証します。スタックはまではs1空であります
  • s2データのニーズがスタックの第三層(奇数層)する要素のスタック順序s1、スタック方法再び左の子の右の子には、これは、スタック順序と同じ層から左右されることを保証します。スタックはまではs2空であります
  • だから、前後に、スタックまでs1s2空であり、終わり

だから、逆か考えるのが賢い利用ああ。

以下のコードを参照してください。

// 执行用时 :16 ms, 在所有 C++ 提交中击败了6.88%的用户
// 内存消耗 :15.1 MB, 在所有 C++ 提交中击败了100.00%的用户

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        vector<int> vt;
        if (root == nullptr) return res;
        int len = 1;
        stack<TreeNode*> s1, s2;
        s2.push(root);
        while (!s1.empty() or !s2.empty()) {
            while (!s2.empty()) {
                TreeNode* tmp = s2.top();
                vt.push_back(tmp->val);
                s2.pop();
                if (tmp->left) s1.push(tmp->left);
                if (tmp->right) s1.push(tmp->right);
            }
            if (vt.size()) res.push_back(vt);
            vt.clear();
            while (!s1.empty()) {
                TreeNode* tmp = s1.top();
                vt.push_back(tmp->val);
                s1.pop();
                if (tmp->right) s2.push(tmp->right);
                if (tmp->left) s2.push(tmp->left);
            }
            if (vt.size()) res.push_back(vt);
            vt.clear();
        }
        return res;
    }
};
公開された302元記事 98ウォンの賞賛 ビュー60000 +

おすすめ

転載: blog.csdn.net/yl_puyu/article/details/104599584