Leetcode 226 Invert Binary Tree 반전 트리
원제 주소
https://leetcode.com/problems/invert-binary-tree/
제목 설명
Invert a binary tree. 두 갈래 나무 한 그루를 반전시키다.
from
4
/ \
2 7
/ \ / \
1 3 6 9
to
4
/ \
7 2
/ \ / \
9 6 3 1
Trivia: 일화:
This problem was inspired by this original tweet by Max Howell: 이 문제의 영감은 Max Howell의 원시 추문(tweet)에서 나왔다.
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off. Google 직원의 90퍼센트가 당신이 쓴 소프트웨어(Homebrew)를 사용하고 있지만, 당신은 백판에 두 갈래 나무를 반전시키는 알고리즘을 쓸 수 없기 때문에 우리는 당신을 원하지 않습니다.
이 사건에 대해 홈브레우 작가가 화이트보드에서 두 갈래 나무를 뒤집지 못해 구글 면접에서 거절당했다는 평가를 어떻게 해야 할지 궁금하다.
이곳에서는 지나치게 많은 토론을 하지 않고 이 문제를 한 번 보면 된다.
문제 풀이 사고방식
직관적으로 보면 문제의 요구가 매우 명확한데 바로 좌우 대조이다.그러면 어떻게 이루어질까요?각 층의 결점을 오른쪽부터 왼쪽으로 순서대로 하나의 대기열에 추가한 다음 대기열의 결점을 순서대로 이전 층의 결점에 연결하는 것을 고려할 수 있다. (이전 층이 반전을 완성했다고 가정하면)
상술한 사고방식을 실현하려면 우리는 i-1층이 반전이 끝났다고 가정하고 i층에 대해 반전 조작을 실행하려고 한다. 우리는 맨 오른쪽의 결점부터 순서대로 각 결점node를 대열queue Last에 넣고 각 결점의 오른쪽 아이와 왼쪽 아이를 대열queue Cur에 넣는다.이렇게 처리가 끝난 후queueLast에 저장된 것은 i층 결점이 반전된 후 왼쪽에서 오른쪽으로 순서를 정한 다음queueCur의 결점을queueLast의 결점에 순서대로 연결하면 i층의 반전을 완성할 수 있다.
코드
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return NULL;
queue*> last, lastTmp, cur, curTmp;
last.push(root);
cur.push(root->right);
cur.push(root->left);
TreeNode* nodeTop, * nodeBottom;
while (!last.empty()) {
while (!last.empty()) { //
//
nodeTop = last.front();
last.pop();
nodeBottom = cur.front();
cur.pop();
nodeTop->left = nodeBottom; //
if (nodeBottom) { // , ,
lastTmp.push(nodeBottom);
curTmp.push(nodeBottom->right);
curTmp.push(nodeBottom->left);
}
nodeBottom = cur.front();
cur.pop();
nodeTop->right = nodeBottom; //
if (nodeBottom) { // , ,
lastTmp.push(nodeBottom);
curTmp.push(nodeBottom->right);
curTmp.push(nodeBottom->left);
}
}
while (!lastTmp.empty()) {
last.push(lastTmp.front());
lastTmp.pop();
}
while (!curTmp.empty()) {
cur.push(curTmp.front());
curTmp.pop();
}
}
return root;
}
};
전체 코드https://github.com/Orange1991/leetcode/blob/master/226/cpp/main.cpp
이외에도vector로 이루어진 버전도 있습니다. 참고할 만한 흥미가 있습니다.https://github.com/Orange1991/leetcode/blob/master/226/cpp/s2.cpp
테스트 데이터
before invert : 4 7 2 1 3 6 9 5 4 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
after invert : 4 2 7 9 6 3 1 NULL NULL NULL NULL NULL NULL 4 5 NULL NULL NULL NULL
before invert : 1 2 3 4 NULL NULL 5 NULL NULL NULL NULL
after invert : 1 3 2 5 NULL NULL 4 NULL NULL NULL NULL
2015/8/28
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
위챗 애플릿의 간단한 로그인 페이지 이동우선 APP에 tapbar를 설정합니다.js에서 관련 데이터 사용자의 정보를 설정합니다. login 페이지는 귀속 데이터가 필요합니다.사용자 이름 로그인 이벤트 바인딩하기; 사용자 정보를 표시하는 사용자 페이지use...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.