二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 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
1、题目分析
二叉搜索树把两个节点搞反了,在不改变结构的情况下恢复二叉搜索树,那就把搞反的两个节点调换一下位置就可以了,不用该改变树的结构。那么二叉搜索树非常重要的一个性质就是:中序遍历是一个严格单调递增的数列。因此如果有两个节点是有问题的那么说明一定存在两个区间,而且区间长度是2,第一个元素是大于第二个元素的。那么我们只需要根据中序遍历找出这个出错的数字,将它们两个值进行交换就可以了。比如如下图所示
2、解题分析
- 进行中序遍历
- 如果查找到第一个区间的话,把x赋给教大的值,将y赋给较小的值;
- 第二个区间的时候只更新y的值
- 整个中序遍历结束之后,x的值应该是7;y的值应该是4;交换x和y值
- 整个二叉搜索树遍历结束,同时也调整结束。
3、代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def recoverTree(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
self.x = None
self.y = None
self.pre = None
def helper(root):
if not root:
return
helper(root.left)
if not self.pre:
self.pre = root
else:
if self.pre.val>root.val:
self.y = root
if not self.x:
self.x = self.pre
self.pre = root
helper(root.right)
helper(root)
if self.x and self.y:
self.x.val,self.y.val = self.y.val,self.x.val
总结:做题遇到二叉搜索树,往往都是需要用性质去做题的。也就是中序遍历是一个严格递归的数列。