LeetCode刷题日记之修剪二叉搜索树

67 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
1.修剪二叉搜索树

题目描述

image.png

解题思路

本题采用递归法解决,需要注意的是,不能遍历到区间外面的节点后就直接返回null,因为小于左区间的节点的右子树可能在区间内,而大于有区间的节点的左子树可能在区间内,所以需要单独处理。

var trimBST = function(root, low, high) {
     if(root === null) return null // 如果遍历节点为null 则直接返回给上一级

     if(root.val < low) { // 如果遍历节点值小于左边界,其右子树可能大于左边界
         return trimBST(root.right,low,high)
     }

     if(root.val > high){ // 同样 左子树可能小于有边界
         return trimBST(root.left,low,high)
     }
     root.left = trimBST(root.left,low,high) // 遍历节点的左子树等于修剪后的左子树
     root.right = trimBST(root.right,low,high)

     return root;
};

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

题目描述

image.png

解题思路

本题需要构建一棵高度平衡的二叉树,需要把数组的中间元素作为树的根节点,如果数组长度为偶数,取中间两个数任意一个都可以,结果不唯一,如果数组长度为奇数,则取最中间的元素即可,我们可以采用递归的方式构建二叉树。
1.确认递归参数及返回值,本题直接在原数组上通过索引来操作,参数为数组,左右区间值,返回值为构建的节点。
2.确认递归终止条件,当左区间大于右区间值时,返回null。
3.确认单层处理逻辑,每次取数组中间元素作为根节点,并递归构建其左右子树。

var sortedArrayToBST = function(nums) {
   var traversal = function(nums,left,right) {
       if(right < left) return null // 右区间大于左区间,返回null
       let mid = left +((right - left) >> 1)
       let node = new TreeNode(nums[mid]) // 构建根节点
       node.left = traversal(nums,left,mid-1) // 递归构建左右子树
       node.right = traversal(nums,mid+1,right)

       return node
   }

   return traversal(nums,0,nums.length-1)
};