Recover Binary Search Tree
leetcode/recover-binary-search-tree
Code
- medium 난이도 문제 두개가 섞여 있다.
- O(N) : 88 ms, faster than 14.90% of Python3 online submissions for Recover Binary Search Tree.
- iterative 하게 inorder traversal 해서 배열을 만든다.
- swap 된 값의 index 를 찾아서 뒤집는다.
- iterative inorder traversal 을 하며 값을 설정한다.
- 두번의 inorder traversal 과 한번의 swap 된 값을 찾는 시간이 걸린다.
- 순서가 바뀐 값을 찾는 알고리즘이 신박하다.
class Solution:
def recoverTree(self, root: TreeNode):
if not root:
return
values = self.inorderTraversal(root)
idx1, idx2 = self.findSwaped(values)
values[idx1], values[idx2] = values[idx2], values[idx1]
self.setValues(values, root)
return self.inorderTraversal(root)
def findSwaped(self, values):
y = x = -1
for i in range(0, len(values) - 1):
if values[i] > values[i + 1]:
y = i + 1
if x == -1:
x = i
else:
break
return y, x
def inorderTraversal(self, root: TreeNode):
stack = []
result = []
node = root
while True:
if node:
stack.append(node)
node = node.left
elif stack:
node = stack.pop()
result.append(node.val)
node = node.right
else:
break
return result
def setValues(self, values, root):
stack = []
valueIdx = 0
node = root
while True:
if node:
stack.append(node)
node = node.left
elif stack:
node = stack.pop()
node.val = values[valueIdx]
valueIdx += 1
node = node.right
else:
break
return