LeetCode 107 Binary Tree Level Order Traversal II(두 갈래 나무의 계층 순서 반복 2)(*)
7390 단어 LeetCode
번역하다
, 。
, 。
:
{3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
:
[
[15,7],
[9,20],
[3]
]
원문
Given a binary tree, return the bottom-up level order traversal of its nodes' values.
(ie, from left to right, level by level from leaf to root).
For example:
Given binary tree {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]
분석
사실은 위에서 아래로 하든 아래에서 위로 하든 상관없어요. 마지막에 반전을 하면 돼요. 관건은 어떻게 훑어보는 거예요.
나는 처음에 문제의 뜻을 잘 이해하지 못했는데, 결과는 노드 아래의 두 잎에 따라vector에 추가되었는데, 후에 원래는 등급에 따라야 한다는 것을 발견하였다.
그래서 선진적으로 먼저 나온 대열을 사용했고 대열에 두 갈래 나무의 등급 정보를 포함해야 하기 때문에pair를 구축했다.
vector<vector<int>> vecAns;
if (!root) return vecAns;
queueint , TreeNode*>> queueTree;
먼저 마지막에 되돌려주는vecAns를 정의한 다음에 루트가 비어 있는지 판단합니다. 그렇다면 직접 되돌려주고 추가 작업을 하지 않습니다.구성된queue에서 int는 계층 정보를 저장하고 TreeNode*는 노드를 저장합니다.
다음은 맵을 정의합니다. 맵의 장점은 언제든지 키를 지정하여 값을 추가할 수 있다는 것입니다. 여기는 바로 등급을 지정하여 정보를 추가하는 것입니다. 뒤에 있는vector는 트리 노드를 저장하는 데 사용됩니다.root의 레벨을 0으로 설정하고 뒤에make_pair는pair를 구성합니다. 마지막으로queue에 추가합니다.
map<int, vector<int>> mapAns;
int rootLevel = 0;
queueTree.push(make_pair(rootLevel, root));
queue가 비어 있지 않으면 계속 순환합니다.매번 시작할 때마다 현재 대기열의 맨 위에 있는 등급 정보와 현재 노드를 분석하여 맵에 추가합니다.추가가 끝나면 팝업할 수 있습니다.왼쪽 트리를 계속 판단하고 비우면queue에 추가해서 다음 작업을 기다립니다.다음 순환을 기다리면 맵에 추가합니다.
while (!queueTree.empty()) {
int currentLevel = (queueTree.front().first);
TreeNode *currentNode = (queueTree.front().second);
mapAns[currentLevel].push_back(currentNode->val);
queueTree.pop();
if (currentNode->left != NULL)
queueTree.push(make_pair(currentLevel + 1, currentNode->left));
if (currentNode->right != NULL)
queueTree.push(make_pair(currentLevel + 1, currentNode->right));
}
맵의 정보를 하나하나push를vector에 넣고 마지막에 바로 리턴합니다.
for (auto iter = mapAns.rbegin(); iter != mapAns.rend(); ++iter) {
vecAns.push_back(iter->second);
}
return vecAns;
Ok, 여러분은 이전 문제를 보실 수 있습니다.
LeetCode 102 Binary Tree Level Order Traversal(두 갈래 나무의 계층 순서 반복)(*)
코드
/**
* 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>> levelOrderBottom(TreeNode *root) {
vector<vector<int>> vecAns;
if (!root) return vecAns;
queueint , TreeNode*>> queueTree;
map<int, vector<int>> mapAns;
int rootLevel = 0;
queueTree.push(make_pair(rootLevel, root));
while (!queueTree.empty()) {
int currentLevel = (queueTree.front().first);
TreeNode *currentNode = (queueTree.front().second);
mapAns[currentLevel].push_back(currentNode->val);
queueTree.pop();
if (currentNode->left != NULL)
queueTree.push(make_pair(currentLevel + 1, currentNode->left));
if (currentNode->right != NULL)
queueTree.push(make_pair(currentLevel + 1, currentNode->right));
}
for (auto iter = mapAns.rbegin(); iter != mapAns.rend(); ++iter) {
vecAns.push_back(iter->second);
}
return vecAns;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.