给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
示例 1:
输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
示例 2:
输入:root = [5,1,7]
输出:[1,null,5,null,7]
提示:
树中节点数的取值范围是 [1, 100]
0 <= Node.val <= 1000
解题思路
二叉搜索树中序遍历的次序就是由小到大的,因此我们在中序遍历的过程中,可以新建一个头节点,然后按中序遍历的顺序,将题目中给出的二叉树节点,一个一个地连在新树上面。在中序遍历的时候,修改节点指向就可以实现。具体地,当我们遍历到一个节点时,把它的左孩子设为空,并将其本身作为上一个遍历到的节点的右孩子。这里需要有一些想象能力。递归遍历的过程中,由于递归函数的调用栈保存了节点的引用。
下面的代码中,使用了 dummy 节点,它一般在链表题中出现。在链表题目中,我们为了防止链表的头结点发生变化之后,不好维护头结点,我们设置 dummy 从而保证头结点不变。这个题目中设置了 dummy ,从而保证了在新的树中,dummy 是根节点,不需要在递归的时候选择根节点,最终返回的时候,要返回的是 dummy.right。
代码
/*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/var t = new(TreeNode)
func increasingBST(root *TreeNode) *TreeNode {res:=tfindIncreasingBST(root)return res.Right
}
func findIncreasingBST(root *TreeNode) {if root.Left!=nil{findIncreasingBST(root.Left)}root.Left=nilt.Right=roott=t.Rightif root.Right!=nil{findIncreasingBST(root.Right)}}