99. 恢复二叉搜索树
题意
在BST中存在两个元素被交换了,现在需要把这两个元素给交换回来变成BST。
解题思路
将其转为数组,并且排好序后重新赋值给树结点;
使用变量pre来保存访问的前一个结点,因为是中序遍历,所以前面一个结点必然是小于当前结点的,并且用两个变量维护错误的两个结点,最后将这两个结点的值进行交换;(需要注意的是,可能存在父结点和子结点交换的情况,所以在开始的时候都保存下来)
实现
class Solution(object):
mistake1 = None
mistake2 = None
pre = None
def recoverTree(self, root):
"""
:type root: TreeNode
:rtype: void Do not return anything, modify root in-place instead.
"""
def dfs(node):
if not node:
return
dfs(node.left)
if self.pre and node.val < self.pre.val:
if not self.mistake1:
self.mistake1 = self.pre
self.mistake2 = node
self.pre = node
dfs(node.right)
dfs(root)
if self.mistake1 and self.mistake2:
self.mistake1.val, self.mistake2.val = self.mistake2.val, self.mistake1.val
def recoverTree(self, root):
"""
:type root: TreeNode
:rtype: void Do not return anything, modify root in-place instead.
"""
node_list, val_list = [], []
def dfs(node):
if not node:
return
dfs(node.left)
node_list.append(node)
val_list.append(node.val)
dfs(node.right)
dfs(root)
val_list.sort()
for idx, val in enumerate(val_list):
node_list[idx].val = val_list[idx]
def recoverTree(self, root):
"""
迭代实现
:type root: TreeNode
:rtype: void Do not return anything, modify root in-place instead.
"""
cur, pre = root, None
first, second = None, None
stack = []
while cur or stack:
if cur:
stack.append(cur)
cur = cur.left
else:
node = stack.pop()
if pre and pre.val >= node.val:
if not first:
first = pre
second = node
pre = node
cur = node.right
first.val, second.val = second.val, first.val