力扣的恢复二叉搜索树 解法
题目描述:
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
输入: [1,3,null,null,2]
1
/
3
2
输出: [3,1,null,null,2]
3
/
1
2
示例 2:
输入: [3,1,4,null,null,2]
3
/
1 4
/
2
输出: [2,1,4,null,null,3]
2
/
1 4
/
3
进阶:
使用 O(n) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regular-expression-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考程序1:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def recoverTree(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
temp = root
firstnode = None
secondnode = None
flag = None
while temp:
if temp.left:
pre = temp.left
while pre.right and pre.right != temp:
pre = pre.right
if not pre.right :
pre.right = temp
temp = temp.left
continue
pre.right = None
if flag and flag.val > temp.val:
if firstnode is None:
firstnode = flag
secondnode = temp
flag = temp
temp = temp.right
firstnode.val,secondnode.val = secondnode.val,firstnode.val
运行结果1:
参考程序2:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def recoverTree(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
def iO(node):
if not node:
return []
return iO(node.left) + [node.val] + iO(node.right)
temp = iO(root)
temp.sort()
self.idx = 0
def change(node):
if not node:
return
change(node.left)
node.val = temp[self.idx]
self.idx = self.idx+1
change(node.right)
change(root)
return root
运行结果2: