website/content.en/ChapterFour/0800~0899/0897.Increasing-Order-Search-Tree.md
Given 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 1 right child.
Example 1:
Input: [5,3,6,2,4,null,8,1,null,null,null,7,9]
5
/ \
3 6
/ \ \
2 4 8
/ / \
1 7 9
Output: [1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
1
\
2
\
3
\
4
\
5
\
6
\
7
\
8
\
9
Note:
Given a tree, rearrange the tree according to inorder traversal, so that the leftmost node in the tree is now the root of the tree, and each node has no left child and only one right child.
Notes:
package leetcode
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// Solution 1 Linked list idea
func increasingBST(root *TreeNode) *TreeNode {
var head = &TreeNode{}
tail := head
recBST(root, tail)
return head.Right
}
func recBST(root, tail *TreeNode) *TreeNode {
if root == nil {
return tail
}
tail = recBST(root.Left, tail)
root.Left = nil // Cut the connection between root and its Left to avoid forming a cycle
tail.Right, tail = root, root // Attach root to tail, and keep tail pointing to the end
tail = recBST(root.Right, tail)
return tail
}
// Solution 2 Simulation
func increasingBST1(root *TreeNode) *TreeNode {
list := []int{}
inorder(root, &list)
if len(list) == 0 {
return root
}
newRoot := &TreeNode{Val: list[0], Left: nil, Right: nil}
cur := newRoot
for index := 1; index < len(list); index++ {
tmp := &TreeNode{Val: list[index], Left: nil, Right: nil}
cur.Right = tmp
cur = tmp
}
return newRoot
}
func inorder(root *TreeNode, output *[]int) {
if root != nil {
inorder(root.Left, output)
*output = append(*output, root.Val)
inorder(root.Right, output)
}
}