バイナリツリーレベルトラバーサルiibinary -tree-level-order-traversal-ii
タイトル説明
バイナリツリーが与えられた場合、下から上へのトラバーサル(左から右へ、リーフノードからルートノードへ、レイヤーごとのトラバーサル)を返します
。例:
与えられたバイナリツリーは{3,9,20、#、 #、15,7}、
二分木を下から上にトラバースした結果は
[
[15,7]、
[ 9,20 ]、
[3]
]です。
二分木が与えられた場合、そのノードの値のボトムアップレベルの順序トラバーサルを返します。(つまり、左から右へ、葉から根へとレベルごとに)。
例:
与えられた二分木{3,9,20、#、#、15,7}、
ボトムアップレベルの順序トラバーサルを次のように返します。
[
[15,7]、[9,20]
、
[3]
]
問題解決のアイデア
- 元の階層トラバーサルと比較すると、下から上への追加要件があるため、逆の順序を実現するには、各トラバーサルの後に結果の先頭までノードを挿入するだけで済みます(ヘッダー補間と同様)。
- ベクトルの挿入:vt
vt.insert(vt.begin(), x);
の先頭に
vt.insert(vt.begin() + 2, x);
要素xを挿入します。vtvt[2]の3番目の位置に要素xを挿入します。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
vector<vector<int> > levelOrderBottom(TreeNode* root) {
vector<vector<int> > res;
if(root == NULL) return res;
queue<TreeNode*> myque;
myque.push(root);
while(!myque.empty()) {
int size = myque.size();
vector<int> cur; //记录当前层的节点
for(int i = 0; i < size; i ++) {
TreeNode* temp = myque.front();
myque.pop();
cur.push_back(temp -> val);
if(temp -> left) myque.push(temp -> left);
if(temp -> right) myque.push(temp -> right);
}
//由于是底层到顶层,所以每次插入到开头
res.insert(res.begin(), cur);
}
return res;
}
};