开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
1.修剪二叉搜索树
题目描述
解题思路
本题采用递归法解决,需要注意的是,不能遍历到区间外面的节点后就直接返回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;
};
题目描述
解题思路
本题需要构建一棵高度平衡的二叉树,需要把数组的中间元素作为树的根节点,如果数组长度为偶数,取中间两个数任意一个都可以,结果不唯一,如果数组长度为奇数,则取最中间的元素即可,我们可以采用递归的方式构建二叉树。
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)
};