二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
可以大致把题目分解为两步:1.找出错误的节点,2.两个节点数据交换
对于错误的节点,可以考虑二叉搜索树的特点,左边永远小于中间永远小于右边。所以采用中序遍历。如果是正常的二叉搜索树,那么节点的值应该是递增的,所以只需要找到有异常的两个节点就算解决了第一步
对于节点的交换就是简单的val相交换就行了
递归
# 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.
"""
self.pre=TreeNode(-float("inf"))
self.first=None
self.second=None
def search(root):
if not root:
return
search(root.left)
if not self.first and self.pre.val > root.val:
self.first=self.pre
if self.first and self.pre.val > root.val:
self.second=root
self.pre=root
search(root.right)
search(root)
self.first.val,self.second.val=self.second.val,self.first.val
这是看题解来写的
在递归中,定义三个对象属性来解决函数递归中引用的问题。
对于两个有问题的节点而言,第一个节点的值必然大于它后面节点的值,否则就是正常的;同样的,第二个节点的值必然小于它前面的节点。根据这个来给self.first和self.second赋值
执行用时 :92 ms, 在所有 Python3 提交中击败了29.32%的用户
内存消耗 :13.9 MB, 在所有 Python3 提交中击败了5.32%的用户
迭代
和递归法同样的方法