代码随想录算法训练营第二十三天 | 108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

50 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

108.将有序数组转换为二叉搜索树

题目分析

题目给出一个升序排列的整数数组,要求将整数数组转换为高度平衡的二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

解题

其实强调高度平衡很重要,要不然就可能构造出一个线性的二叉搜索树。

继续考虑递归的三要素:

  1. 参数和返回值

参数为数组和数组的左右边界,因为我们用数组的索引值来划分数组,并不改变数组本身的结构。我们依然通过返回值来构造节点的左右孩子。

  1. 终止条件

我们确定左闭右闭的区间,当区间left>right的时候返回空。

  1. 单层循环的逻辑

循环时,我们取中间位置以中间位置的元素构造节点。并划分区间递归构造左子树和右子树。

代码如下:

var sortedArrayToBST = function(nums) {
    const buildTree = (Arr,left,right) => {
        if(left > right) return null
        let mid = Math.floor(left + (right - left) / 2)
        let root = new TreeNode(Arr[mid])
        root.left = buildTree(Arr,left,mid - 1)
        root.right = buildTree(Arr,mid + 1,right)
        return root
    }
    return buildTree(nums,0,nums.length - 1)
};

538.把二叉搜索树转换为累加树

题目分析

题目给出一个二叉搜索树,要求将其转换为累加树。

累加树是每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

解题

这道题我们可以采用反中序遍历的方式,先遍历右节点,在中间进行加的处理,再遍历左节点。通过一个临时变量来保存上一个节点的值。

代码如下:

var convertBST = function(root) {
    let pre = 0
    const Order = (cur) => {
        if(cur) {
            Order(cur.right)
            cur.val += pre
            pre = cur.val
            Order(cur.left)
        }
    }
    Order(root)
    return root
};