leetcode 897. 递增顺序搜索树—golang版本 | Go主题月

216 阅读2分钟

给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。

示例 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:=t
	findIncreasingBST(root)
	return res.Right
}
func findIncreasingBST(root *TreeNode)  {

	if root.Left!=nil{
		findIncreasingBST(root.Left)
	}
	root.Left=nil
	t.Right=root
	t=t.Right
	if root.Right!=nil{
		findIncreasingBST(root.Right)
	}

}