概述
一个二进制搜索树的根被给定。二进制搜索树的两个节点被调换了。我们需要修复二进制树并恢复原来的结构。
程序
以下是相同的程序
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func recoverTree(root *TreeNode) {
var prev *TreeNode
var first *TreeNode
var mid *TreeNode
var last *TreeNode
recoverTreeUtil(root, &prev, &first, &mid, &last)
if first != nil && last != nil {
first.Val, last.Val = last.Val, first.Val
} else if first != nil && mid != nil {
first.Val, mid.Val = mid.Val, first.Val
}
}
func recoverTreeUtil(root *TreeNode, prev, first, mid, last **TreeNode) {
if root == nil {
return
}
recoverTreeUtil(root.Left, prev, first, mid, last)
if *prev == nil {
*prev = root
} else if *first == nil && (*prev).Val > root.Val {
*first = *prev
*mid = root
} else if (*prev).Val > root.Val {
*last = root
}
*prev = root
recoverTreeUtil(root.Right, prev, first, mid, last)
}
func main() {
root := TreeNode{Val: 2}
root.Left = &TreeNode{Val: 3}
root.Right = &TreeNode{Val: 1}
recoverTree(&root)
fmt.Println(root.Val)
fmt.Println(root.Left.Val)
fmt.Println(root.Right.Val)
}
输出
2
1
3
注意: 请查看我们的Golang高级教程。这个系列的教程是精心设计的,我们试图用例子来涵盖所有的概念。本教程是为那些希望获得专业知识和扎实了解Golang的人准备的 -Golang高级教程