[Day33-02]-[二叉树] 恢复二叉搜索树
作者:方勇(gopher)
- 2022 年 5 月 02 日
本文字数:1019 字
阅读完需:约 3 分钟
99. 恢复二叉搜索树
难度中等 711 收藏分享切换为英文接收动态反馈
示例 1:
输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 的左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。
复制代码
示例 2:
输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。
复制代码
题解:这题太经典了 时间复杂度 O(n),空间复杂度 O(1)
整个过程就是寻找前驱节点的过程
curr,next,pre
每次需要找到 next 的 Right 的最后一个不为空的 Right 节点 记为 pre
pre.Right = curr.Right
curr.Left = nil
curr.Right = next
func TestFlatten(t *testing.T) {
var root = &TreeNode{
Val: 1,
Left: &TreeNode{
Val: 2,
Left: &TreeNode{
Val: 3,
},
Right: &TreeNode{
Val: 4,
},
},
Right: &TreeNode{
Val: 5,
Left: &TreeNode{
Val: 7,
},
Right: &TreeNode{
Val: 6,
},
},
}
// 题解:这题太经典了 时间复杂度O(n),空间复杂度O(1)
// 整个过程就是寻找前驱节点的过程
// curr,next,pre
// 每次需要找到next的Right 的最后一个不为空的Right节点 记为pre
// pre.Right = curr.Right
// curr.Left = nil
// curr.Right = next
curr := root
for curr != nil {
if curr.Left != nil {
next := curr.Left
pre := next
for pre.Right != nil {
pre = pre.Right
}
pre.Right = curr.Right
curr.Left, curr.Right = nil, next
}
curr = curr.Right
}
t.Log(root)
}
复制代码
题解 2
func TestFlatten2(t *testing.T) {
var root = &TreeNode{
Val: 1,
Left: &TreeNode{
Val: 2,
Left: &TreeNode{
Val: 3,
},
Right: &TreeNode{
Val: 4,
},
},
Right: &TreeNode{
Val: 5,
Left: &TreeNode{
Val: 7,
},
Right: &TreeNode{
Val: 6,
},
},
}
// 题解:时间复杂度O(n),空间复杂度O(1)
var list []*TreeNode // 存储前序遍历的所有节点
var dfs func(root *TreeNode) // DLR
dfs = func(root *TreeNode) {
if root == nil {
return
}
list = append(list, root)
dfs(root.Left)
dfs(root.Right)
}
dfs(root)
for i := 1; i < len(list); i++ { // 交换前面的
prev, curr := list[i-1], list[i]
prev.Left, prev.Right = nil, curr
}
t.Log(root)
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 6
方勇(gopher)
关注
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
评论