写点什么

[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)}
复制代码


用户头像

Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入

我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!

评论

发布
暂无评论
[Day33-02]-[二叉树] 恢复二叉搜索树_方勇(gopher)_InfoQ写作社区