0
点赞
收藏
分享

微信扫一扫

【二叉树】恢复二叉搜索树


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 应用:​​小五笔​


举报

相关推荐

0 条评论