[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,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!










评论