-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathincreasing-order-search-tree.go
64 lines (60 loc) · 1.33 KB
/
increasing-order-search-tree.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Given the root of a binary search tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root of the tree, and every node has no left child and only one right child.
//
//
// Example 1:
//
//
// Input: root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
// Output: [1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
//
//
// Example 2:
//
//
// Input: root = [5,1,7]
// Output: [1,null,5,null,7]
//
//
//
// Constraints:
//
//
// The number of nodes in the given tree will be in the range [1, 100].
// 0 <= Node.val <= 1000
//
//
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func increasingBST(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
arr := []*TreeNode{}
inOrder(root, &arr)
// We now have the nodes in the right order
// However, there are still "Left" links.
// Delete the "Left" links and link "Right" to next in the array
for i := 0; i < len(arr)-1; i++ {
arr[i].Left = nil
arr[i].Right = arr[i+1]
// Deal with the "Left" of the last node in the tree
if i == len(arr)-2 {
arr[i+1].Left = nil
}
}
return arr[0]
}
func inOrder(root *TreeNode, arr *[]*TreeNode) {
if root == nil {
return
}
inOrder(root.Left, arr)
*arr = append(*arr, root)
inOrder(root.Right, arr)
}