0x00 题目
给你 二叉搜索树 的根节点 root 该树中的 两个 节点被错误地交换
 请在不改变其结构的情况下,恢复这棵树
进阶:使用 O(n) 空间复杂度的解法很容易实现。
 你能想出一个只使用 常数 空间的解决方案吗?
0x01 思路
二叉搜索树 中序遍历 是一个 升序 数组
 有 2 个节点被错误地交换了,那么会存在以下特征:
 正确顺序:1,2,3,4,5,6
 错误顺序:1,2,5,4,3,6
 有 2 个地方,后 一个数比 前 一个数【小】
或者
 错误顺序:1,2,4,3,5,6
 有 1 个地方,后 一个数比 前 一个数【小】
记录这 2 个节点,然后交换它们的值即可
 因为不知道是有 1 个,还是 2 个地方,所以要遍历全部节点
node2 会在符合条件的地方更新
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
    public var val: Int
    public var left: TreeNode?
    public var right: TreeNode?
    public init() { self.val = 0; self.left = nil; self.right = nil; }
    public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
    public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
        self.val = val
        self.left = left
        self.right = right
    }
}解法:
func recoverTree(_ root: TreeNode?) {
    var pre: TreeNode?
    var node1: TreeNode?
    var node2: TreeNode?
    
    func dfs(_ root: TreeNode?) {
        guard let root = root else {
            return
        }
        
        // 前序遍历位置
        dfs(root.left)
        
        // 中序遍历位置
        if pre == nil {
            pre = root
        }else if root.val > pre!.val {
            pre = root
        }else{
            // 记录节点
            if node1 == nil {
                node1 = pre
            }
            node2 = root
        }
        
        dfs(root.right)
        // 后序遍历位置
    }
    
    dfs(root)
    
    // 进行交换
    let tmp = node2!.val
    node2?.val = node1!.val
    node1?.val = tmp
}小五笔
微信小程序:XWubi App Store 应用:小五笔
                










