Leet Code 두 갈래 나무에 대한 문제풀이 노트 Python 구현
17819 단어 LeetCode
두 갈래 나무에 대한 문제풀이 노트,Python 구현
두 갈래 나무의 정의
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
98. 두 갈래 검색 트리 검증 바이너리 검색 트리
LeetCodeCN 98번 링크
첫 번째 방법: 중간 순서로 두 갈래 나무를 옮겨다니며 수조에 저장하고 직접 상승 순서로 정렬하여 중량을 제거한 원래의 두 갈래 나무와 비교한다class Solution:
def isValidBST(self, root: TreeNode) -> bool:
inorder = self.inorder(root)
return inorder == list(sorted(set(inorder)))
def inorder(self, root) -> list:
if root is None:
return []
return self.inorder(root.left) + [root.val] + self.inorder(root.right)
두 번째 방법: 중간 순서는 이전 노드의 값이 현재 노드의 값보다 작은지 비교하기만 하면 되고 저장할 필요가 없다class Solution:
def isValidBST(self, root: TreeNode) -> bool:
self.prev = None
return self.helper(root)
def helper(self, root):
if root is None:
return True
if not self.helper(root.left):
return False
if self.prev and self.prev.val >= root.val:
return False
self.prev = root
return self.helper(root.right)
세 번째 방법: 각 노드의 왼쪽 아이의 값이 아버지 노드의 값보다 작은지, 오른쪽 아이의 값이 아버지 노드의 값보다 큰지 차례로 검증한다.class Solution:
def isValidBST(self, root: TreeNode) -> bool:
mini, maxi = float('-inf'), float('inf')
return self.isValid(root, mini, maxi)
def isValid(self, root: TreeNode, mini: int, maxi: int) -> bool:
if root is None:
return True
if mini >= root.val or maxi <= root.val:
return False
return self.isValid(root.left, mini, root.val) and self.isValid(root.right, root.val, maxi)
236. 이차나무의 최근 공공조상 Lowest Common Ancestor of a Binary Tree
LeetCodeCN 236번째 링크
우선 루트가 비어 있으면 루트를 되돌려주고, 루트가 p 또는 q라면 루트는 최근의 공공 조상이다.그리고 각각 좌자수와 우자수를 귀속시키고 결과를 보존한다. 양쪽을 모두 찾을 수 있다면 본 노드가 최근의 공공조상임을 증명하고 찾으면서 찾지 못하면 찾을 수 있는 쪽으로 계속 찾아간다.class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root is None:
return None
if root == p or root == q:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left or right:
if left is None:
return right
elif right is None:
return left
else:
return root
else:
return None
235. 두 갈래 수색 나무의 최근 공공 조상 Lowest Common Ancestor of a Binary Search Tree
LeetCodeCN 235번째 링크
첫 번째 방법: 위의 방법으로
두 번째 방법: 두 갈래로 나무를 검색하는 왼쪽 나무는 모두 아버지 노드보다 작고 오른쪽 나무는 아버지 노드보다 큰 특성을 이용하여 첫 번째 방법을 간소화할 수 있다class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if p.val < root.val and q.val < root.val:
return self.lowestCommonAncestor(root.left, p, q)
if p.val > root.val and q.val > root.val:
return self.lowestCommonAncestor(root.right, p, q)
return root
세 번째 방법: 방법 2의 사고방식과 같이 귀속을 순환으로 바꾼다 def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
while root:
if p.val < root.val and q.val < root.val:
root = root.left
elif p.val > root.val and q.val > root.val:
root = root.right
else:
return root
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
inorder = self.inorder(root)
return inorder == list(sorted(set(inorder)))
def inorder(self, root) -> list:
if root is None:
return []
return self.inorder(root.left) + [root.val] + self.inorder(root.right)
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
self.prev = None
return self.helper(root)
def helper(self, root):
if root is None:
return True
if not self.helper(root.left):
return False
if self.prev and self.prev.val >= root.val:
return False
self.prev = root
return self.helper(root.right)
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
mini, maxi = float('-inf'), float('inf')
return self.isValid(root, mini, maxi)
def isValid(self, root: TreeNode, mini: int, maxi: int) -> bool:
if root is None:
return True
if mini >= root.val or maxi <= root.val:
return False
return self.isValid(root.left, mini, root.val) and self.isValid(root.right, root.val, maxi)
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root is None:
return None
if root == p or root == q:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left or right:
if left is None:
return right
elif right is None:
return left
else:
return root
else:
return None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if p.val < root.val and q.val < root.val:
return self.lowestCommonAncestor(root.left, p, q)
if p.val > root.val and q.val > root.val:
return self.lowestCommonAncestor(root.right, p, q)
return root
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
while root:
if p.val < root.val and q.val < root.val:
root = root.left
elif p.val > root.val and q.val > root.val:
root = root.right
else:
return root
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.