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