| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | 
							- package main
 
- import (
 
- 	"math"
 
- )
 
- /**
 
-  * Definition for a binary tree node.
 
-  * type TreeNode struct {
 
-  *     Val int
 
-  *     Left *TreeNode
 
-  *     Right *TreeNode
 
-  * }
 
-  */
 
- func recoverTree(root *TreeNode) {
 
- 	if root == nil {
 
- 		return
 
- 	}
 
- 	var swap1, swap2 *TreeNode
 
- 	prev := &TreeNode{math.MinInt32, nil, nil}
 
- 	var recurse func(*TreeNode)
 
- 	recurse = func(root *TreeNode) {
 
- 		if root == nil {
 
- 			return
 
- 		}
 
- 		recurse(root.Left)
 
- 		// It's kinda strange, but there's an example:
 
- 		// 1 2 6 4 5 3
 
- 		// The first element must be the larger one, so pick prev;
 
- 		// the second element is the smaller one, pick root.
 
- 		if swap1 == nil && root.Val <= prev.Val {
 
- 			swap1 = prev
 
- 		}
 
- 		if swap1 != nil && root.Val <= prev.Val {
 
- 			swap2 = root
 
- 		}
 
- 		prev = root
 
- 		recurse(root.Right)
 
- 	}
 
- 	recurse(root)
 
- 	swap1.Val, swap2.Val = swap2.Val, swap1.Val
 
- }
 
- // func main() {
 
- // 	tree := toBinaryTree(nil)
 
- // 	recoverTree(tree)
 
- // 	printTree(tree)
 
- // 	tree = toBinaryTree(newInt(1), newInt(3), nil, nil, newInt(2))
 
- // 	recoverTree(tree)
 
- // 	printTree(tree)
 
- // 	tree = toBinaryTree(newInt(3), newInt(1), newInt(4), nil, nil, newInt(2))
 
- // 	recoverTree(tree)
 
- // 	printTree(tree)
 
- // }
 
 
  |