leetcode101/검지offer28.대칭 두 갈래 나무
1. 제목 설명
두 갈래 나무를 정해서 거울이 대칭적인지 확인하세요.
예를 들어 두 갈래 나무[1,2,2,3,4,3]는 대칭적이다.
1/\2 2/\/\3 4 3 하지만 아래 이것 [1, 2, null, 3, null, 3] 은 미러 대칭이 아닙니다.
1/\2 2\3 설명:
만약 네가 귀속과 교체 두 가지 방법을 운용하여 이 문제를 해결할 수 있다면, 매우 가산점이 있을 것이다.
2. 문제풀이 사고방식
검지 offer 해법:
루트-오른쪽 아이-왼쪽 아이, 먼저 루트(루트-왼쪽 아이-오른쪽 아이) 결과와 일치하면 대칭적인 새로운 루트 방식을 정의합니다.중간 노드가 충족되지 않으면 False로 돌아갑니다.
반복법:
반복 쓰기는 두 개의 대기열queue를 빌려 이루어져야 합니다. 우선 공백을 판정하고 루트가 비어 있으면true로 되돌아갑니다.그렇지 않으면 루트의 좌우 두 개의 하위 결점을 각각 두 개의 대기열에 불러오고 순환을 시작합니다. 순환 조건은 두 개의 대기열이 비어 있지 않습니다.while 순환에서 우리는 먼저 두 대열의 첫 번째 요소를 각각 꺼낸다. 만약에 두 개가 모두 빈 결점이라면 바로 건너뛴다. 왜냐하면 우리는 아직 비교가 끝나지 않았기 때문에 어떤 결점이 왼쪽 결점이 없을 수도 있지만 오른쪽 결점은 여전히 존재하기 때문에 여기는continue만 있을 수 있다.그리고 다시 보면 하나가 비어 있고 다른 하나가 비어 있지 않으면 대칭성은 이미 파괴되어 더 이상 비교할 필요가 없다. 바로false로 돌아간다.만약 두 결점이 모두 존재하지만 그 결점 값이 다르면 이것은 대칭성을 파괴하고false로 돌아간다.그렇지 않으면node1의 왼쪽 결점과 오른쪽 결점을 대기열 1로 배열하고, 여기에서 node2의 오른쪽 결점과 왼쪽 결점을 대기열 2로 배열하고, 순서에 대한 문제를 주의해야 한다.마지막으로 순환이 끝난 후true로 돌아갑니다. 여기는 두 개의 대기열이 동시에 비어 있는지 확인할 필요가 없습니다. 순환이 끝난 후에는 두 개의 대기열이 모두 비어 있는 상황일 수 있기 때문입니다. 다른 상황, 예를 들어 텅 비어 있지 않으면 순환 내부에서false로 돌아옵니다.
3. 코드 구현
버전 1# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def dfs(self,root1,root2):
if not root1 and not root2:
return True
if (root1 and not root2) or (root2 and not root1) or root1.val!=root2.val:
return False
res1=True
res2=True
res1=self.dfs(root1.left, root2.right)
res2=self.dfs(root1.right, root2.left)
return res1 and res2
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.dfs(root,root)
버전 2(간결하게):# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def dfs(self,root1,root2):
if not root1 and not root2:
return True
if not root1 or not root2 or root1.val!=root2.val:
return False
res1=self.dfs(root1.left, root2.right)
res2=self.dfs(root1.right, root2.left)
return res1 and res2
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.dfs(root,root)
또 다른 좋은 실현:# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSame(self,r1,r2):
if not r1 and not r2:
return True
if not r1:
return False
if not r2:
return False
if r1.val!=r2.val:
return False
return self.isSame(r1.left,r2.right) and self.isSame(r1.right,r2.left)
def isSymmetrical(self, pRoot):
# write code here
return self.isSame(pRoot,pRoot)
반복법(C++):class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
queue q1, q2;
q1.push(root->left);
q2.push(root->right);
while (!q1.empty() && !q2.empty()) {
TreeNode *node1 = q1.front(); q1.pop();
TreeNode *node2 = q2.front(); q2.pop();
if (!node1 && !node2) continue;
if((node1 && !node2) || (!node1 && node2)) return false;
if (node1->val != node2->val) return false;
q1.push(node1->left);
q1.push(node1->right);
q2.push(node2->right);
q2.push(node2->left);
}
return true;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」
해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다.
빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
검지 offer 해법:
루트-오른쪽 아이-왼쪽 아이, 먼저 루트(루트-왼쪽 아이-오른쪽 아이) 결과와 일치하면 대칭적인 새로운 루트 방식을 정의합니다.중간 노드가 충족되지 않으면 False로 돌아갑니다.
반복법:
반복 쓰기는 두 개의 대기열queue를 빌려 이루어져야 합니다. 우선 공백을 판정하고 루트가 비어 있으면true로 되돌아갑니다.그렇지 않으면 루트의 좌우 두 개의 하위 결점을 각각 두 개의 대기열에 불러오고 순환을 시작합니다. 순환 조건은 두 개의 대기열이 비어 있지 않습니다.while 순환에서 우리는 먼저 두 대열의 첫 번째 요소를 각각 꺼낸다. 만약에 두 개가 모두 빈 결점이라면 바로 건너뛴다. 왜냐하면 우리는 아직 비교가 끝나지 않았기 때문에 어떤 결점이 왼쪽 결점이 없을 수도 있지만 오른쪽 결점은 여전히 존재하기 때문에 여기는continue만 있을 수 있다.그리고 다시 보면 하나가 비어 있고 다른 하나가 비어 있지 않으면 대칭성은 이미 파괴되어 더 이상 비교할 필요가 없다. 바로false로 돌아간다.만약 두 결점이 모두 존재하지만 그 결점 값이 다르면 이것은 대칭성을 파괴하고false로 돌아간다.그렇지 않으면node1의 왼쪽 결점과 오른쪽 결점을 대기열 1로 배열하고, 여기에서 node2의 오른쪽 결점과 왼쪽 결점을 대기열 2로 배열하고, 순서에 대한 문제를 주의해야 한다.마지막으로 순환이 끝난 후true로 돌아갑니다. 여기는 두 개의 대기열이 동시에 비어 있는지 확인할 필요가 없습니다. 순환이 끝난 후에는 두 개의 대기열이 모두 비어 있는 상황일 수 있기 때문입니다. 다른 상황, 예를 들어 텅 비어 있지 않으면 순환 내부에서false로 돌아옵니다.
3. 코드 구현
버전 1# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def dfs(self,root1,root2):
if not root1 and not root2:
return True
if (root1 and not root2) or (root2 and not root1) or root1.val!=root2.val:
return False
res1=True
res2=True
res1=self.dfs(root1.left, root2.right)
res2=self.dfs(root1.right, root2.left)
return res1 and res2
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.dfs(root,root)
버전 2(간결하게):# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def dfs(self,root1,root2):
if not root1 and not root2:
return True
if not root1 or not root2 or root1.val!=root2.val:
return False
res1=self.dfs(root1.left, root2.right)
res2=self.dfs(root1.right, root2.left)
return res1 and res2
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.dfs(root,root)
또 다른 좋은 실현:# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSame(self,r1,r2):
if not r1 and not r2:
return True
if not r1:
return False
if not r2:
return False
if r1.val!=r2.val:
return False
return self.isSame(r1.left,r2.right) and self.isSame(r1.right,r2.left)
def isSymmetrical(self, pRoot):
# write code here
return self.isSame(pRoot,pRoot)
반복법(C++):class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
queue q1, q2;
q1.push(root->left);
q2.push(root->right);
while (!q1.empty() && !q2.empty()) {
TreeNode *node1 = q1.front(); q1.pop();
TreeNode *node2 = q2.front(); q2.pop();
if (!node1 && !node2) continue;
if((node1 && !node2) || (!node1 && node2)) return false;
if (node1->val != node2->val) return false;
q1.push(node1->left);
q1.push(node1->right);
q2.push(node2->right);
q2.push(node2->left);
}
return true;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」
해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다.
빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def dfs(self,root1,root2):
if not root1 and not root2:
return True
if (root1 and not root2) or (root2 and not root1) or root1.val!=root2.val:
return False
res1=True
res2=True
res1=self.dfs(root1.left, root2.right)
res2=self.dfs(root1.right, root2.left)
return res1 and res2
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.dfs(root,root)
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def dfs(self,root1,root2):
if not root1 and not root2:
return True
if not root1 or not root2 or root1.val!=root2.val:
return False
res1=self.dfs(root1.left, root2.right)
res2=self.dfs(root1.right, root2.left)
return res1 and res2
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.dfs(root,root)
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSame(self,r1,r2):
if not r1 and not r2:
return True
if not r1:
return False
if not r2:
return False
if r1.val!=r2.val:
return False
return self.isSame(r1.left,r2.right) and self.isSame(r1.right,r2.left)
def isSymmetrical(self, pRoot):
# write code here
return self.isSame(pRoot,pRoot)
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
queue q1, q2;
q1.push(root->left);
q2.push(root->right);
while (!q1.empty() && !q2.empty()) {
TreeNode *node1 = q1.front(); q1.pop();
TreeNode *node2 = q2.front(); q2.pop();
if (!node1 && !node2) continue;
if((node1 && !node2) || (!node1 && node2)) return false;
if (node1->val != node2->val) return false;
q1.push(node1->left);
q1.push(node1->right);
q2.push(node2->right);
q2.push(node2->left);
}
return true;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다. 빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.