原题
https://leetcode.cn/problems/recover-binary-search-tree/description/
思路
中序遍历 + 双指针
复杂度
时间:O(n)
空间:O(n)
Python代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def recoverTree(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
l = []
def dfs(root):
if not root:
return
dfs(root.left)
l.append(root)
dfs(root.right)
dfs(root)
x = None
y = None
pre = l[0]
for i in range(1, len(l)):
if pre.val > l[i].val:
y = l[i]
if not x:
x = pre
pre = l[i]
if x and y:
x.val, y.val = y.val, x.val
Go代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func recoverTree(root *TreeNode) {
var l []*TreeNode
// 匿名函数
var dfs func(*TreeNode)
dfs = func(root *TreeNode) {
if root == nil {
return
}
dfs(root.Left)
l = append(l, root)
dfs(root.Right)
}
dfs(root)
var x, y *TreeNode
pre := l[0]
for i := 1; i < len(l); i++ {
if pre.Val > l[i].Val {
y = l[i]
if x == nil {
x = pre
}
}
pre = l[i]
}
if x != nil && y != nil {
x.Val, y.Val = y.Val, x.Val
}
}

被折叠的 条评论
为什么被折叠?



