代码随想录的第二十天(二叉树)

90 阅读2分钟

代码随想录的第二十天(二叉树)

669. 修剪二叉搜索树

var trimBST = function(root, low, high) {
    if (root === null) return null
    if (root.val < low) {
        let right = trimBST(root.right, low, high)
        return right
    }
    if (root.val > high) {
        let left = trimBST(root.left, low, high)
        return left
    }
    root.left = trimBST(root.left, low, high)
    root.right = trimBST(root.right, low, high)
    return root
};

思路:

1、首先确定参数:就是根节点和左右边界

2、其次确定终止条件:当到叶子节点的时候返回null,当前值小于最小边界的时候,需要移除节点,但是不能直接返回null删除,因为在这个节点的右子树可能有符合条件的值,所以需要去遍历找到符合的右子树进行返回;大于时正好相反

3、单层递归:左右子树进行拼接返回来的参数,最后返回当前树

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

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

思路:

1、首先要先熟悉如何构造二叉树:确定根节点的位置,然后从根节点开始遍历左区间得出自己的左子树,遍历右区间得出自己的右子树

2、其次要明白二叉搜索树:就是中序遍历递增

3、传入参数:根节点和左右区间边界

4、终止条件:就是当左边界大于右边界的时候停止

5、单层递归:主要是确定中心点的位置,搜索二叉树就是每次数组的中心值,需要注意的是,当左边界不在是0开始的时候,中心点位置是left+right / 2

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

var convertBST = function(root) {
    let pre = null
    function getTree (root) {
        if ( root === null) return null
        if (root.right) getTree(root.right)
        if (pre) root.val += pre.val
        pre = root
        if (root.left) getTree(root.left)
        return root
    }
    return getTree(root)
};

思路:

1、这道题相对简单,一个累加的操作,首先想到就是双指针进行累加

2、从后往前,那就是右中左这个顺序进行累加,然后依次累加返回就行