【一年百题】897. 递增顺序搜索树

2022-12-02 20:54:21 浏览数 (1)

今天的每日一题是 1601. 最多可达成的换楼请求数目

有点难度,没搞出来,搞一道简单点的。哈哈!习惯养成中。

题目:

给你一棵二叉搜索树的 root ,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。 https://leetcode-cn.com/problems/increasing-order-search-tree/

示例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

分析:先分析展平之后二叉树的特性。它仍然是一棵二叉搜索树,而且它除叶节点外每个节点都只有右子节点。由于二叉搜索树中右子节点大于或等于它的父节点,因此调整之后的二叉搜索树从根节点开始顺着指向右子节点的指针向下经过的节点的值将是递增排序的。展平之后的二叉搜索树如图8.8(b)所示,从上到下它的节点的值的确是递增排序的。

代码语言:javascript复制
func increasingBST(root *TreeNode) *TreeNode {
  var arr []int
  var midFunc func(*TreeNode)
  midFunc = func(node *TreeNode) {
    // 按中序遍历的形式 将数放到数组中
    if node != nil {
      midFunc(node.Left)
      arr = append(arr, node.Val)
      midFunc(node.Right)
    }
  }
  midFunc(root)

  r := &TreeNode{}
  curNode := r
  // 开始将数组中的数 挂到目标树上。
  for _, v := range arr {
    curNode.Right = &TreeNode{Val: v}
    curNode = curNode.Right
  }
  return r.Right
}

0 人点赞