【leetcode】【中】102。バイナリツリーの上位のオーダートラバーサル

102バイナリツリーの上位のオーダートラバーサル

バイナリツリーを考えると、返す  レベルのための  そのノードの値のトラバーサルを。(すなわち、左から右、レベルごとに)。

たとえば、次のように
考えると、バイナリツリー  [3,9,20,null,null,15,7]

    3
   / \
  9 20
    / \
   15 7

レベル順トラバーサルを返します。

[
  [3]
  [9,20]、
  [15,7]
]

トピックリンク:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

 

思考

ツリートラバーサル順序は幅優先トラバーサルです。

キュートラバーサル付き。

カラムの異なる層を分離する方法:

方法1)非再帰的には、可変レコード長キューと、一の周期の長さの端部に到達します。

方法2)非再帰的、ヌルポインタの終了ヒントに、一方の端部を横切ります。

方法3)再帰的に、層の数、挿入位置に対応する各レイヤに応じて作成された収納スペースの層の数を計算します。

注:チームのニーズは空の場合、またはチームのニーズは空の刑を宣告する前に宣告しました。

法則

/**
 * 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==NULL) return res;
        queue<TreeNode*> record;
        record.push(root);
        while(!record.empty()){
            int len = record.size();
            vector<int> restmp;
            for(int i=0; i<len; ++i){
                auto tmp = record.front();
                record.pop();
                restmp.push_back(tmp->val);
                if(tmp->left) record.push(tmp->left);
                if(tmp->right) record.push(tmp->right);
            }
            res.push_back(restmp);
        }
        return res;
    }
};

アクトII

注:(分割レベル用の)キューに空ポインタに、それは最初のキュー内の要素があるかどうかを決定しなければならない前に、(ツリーの端部を横断されたかどうかを決定するために)それ以外の場合は、無限ループのヌルポインタに陥ります。

/**
 * 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==NULL) return res;
        queue<TreeNode*> record;
        record.push(root);
        record.push(NULL);
        vector<int> restmp;
        while(!record.empty()){
            auto tmp = record.front();
            record.pop();
            if(tmp){
                restmp.push_back(tmp->val);
                if(tmp->left) record.push(tmp->left);
                if(tmp->right) record.push(tmp->right);
            }else{
                res.push_back(restmp);
                restmp.clear();
                if(record.size()>0) record.push(NULL);
            }
        }
        return res;
    }
};

法III

再帰的思考:異なる層は異なる場所に保存されていることを確認するために、同一の層、右の子よりも左の子の最初の訪問を確保します。

ミート上記の条件とすることができます。

注:参照を使用するために、質量の参加を使用して、最終的な結果を得るためにこのレコードは、彼らは、関数の終了後にレコードを変更しません。

/**
 * 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==NULL) return res;
        int level = getLevel(root);
        res.resize(level);
        order(root, 0, res);
        return res;
    }
    void order(TreeNode* root, int level, vector<vector<int>> &res){
        if(root!=NULL){
            (res[level]).push_back(root->val);
            order(root->left, level+1, res);
            order(root->right, level+1, res);
        }
    }
    int getLevel(TreeNode* root){
        if(root==NULL) return 0;
        return max(getLevel(root->left), getLevel(root->right))+1;
    }
};

上記次のコードとの間の差は、次のとおりメンバ変数を使用して結果を記録します。

/**
 * 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 {
private:
    vector<vector<int>> res;
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root==NULL) return res;
        int level = getLevel(root);
        res.resize(level);
        order(root, 0);
        return res;
    }
    void order(TreeNode* root, int level){
        if(root!=NULL){
            (res[level]).push_back(root->val);
            order(root->left, level+1);
            order(root->right, level+1);
        }
    }
    int getLevel(TreeNode* root){
        if(root==NULL) return 0;
        return max(getLevel(root->left), getLevel(root->right))+1;
    }
};

 

公開された83元の記事 ウォンの賞賛2 ビュー2956

おすすめ

転載: blog.csdn.net/lemonade13/article/details/104294400