leetcode_99. 恢复二叉搜索树
目录
一、题目内容
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 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) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?
二、解题思路
中序遍历二叉搜索树则可以得到一个递增的序列,因此如果在这个序列中出现了两个数字交换,则大的数一定换到了小的数的位置,因此之后大的数和大的数之后的数组成了一个降序对,因此第一个降序对中的大数就是那个被换的数,但是和哪个换的就不知道了,因此还需要往后找。
再看小的数,因为被换到了后面,因此这个小的数比它现在位置之前的那个数要小,因此可以得到第二个降序对,因而第二个降序对里小的数就是那个和已经确定的大的数交换的。
因此中序遍历完成后,把得到的大数和小数交换即可恢复二叉搜索树。
例如:
[1,2,3,4,5,6]
3和6交换:
[1,2,6,4,5,3]
第一个降序对:
[6,4]
第二个降序对:
[5,3]
3确实比4和5小,因此记录6这个大数,再找到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
-
-
def __repr__(self):
-
return str(self.val)
-
-
class Solution:
-
def __init__(self):
-
self.large = None
-
self.small = None
-
self.pre = None
-
def recoverTree(self, root: TreeNode) -> None:
-
"""
-
Do not return anything, modify root in-place instead.
-
"""
-
self.inorder(root)
-
temp = self.large.val
-
self.large.val = self.small.val
-
self.small.val = temp
-
-
-
def inorder(self, root):
-
if not root:
-
return
-
self.inorder(root.left)
-
-
if self.pre is not None and self.pre.val > root.val:
-
if self.large is None: # 找到了第一个大数
-
self.large = self.pre
-
self.small = root # 一直找小数
-
self.pre = root
-
self.inorder(root.right)
-
-
if __name__ == '__main__':
-
a = TreeNode(1)
-
a.left = TreeNode(3)
-
a.left.right = TreeNode(2)
-
-
s = Solution()
-
s.recoverTree(a)
-
print(a)
文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。
原文链接:nickhuang1996.blog.csdn.net/article/details/108729119
- 点赞
- 收藏
- 关注作者
评论(0)