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