代码随想录的第二十天(二叉树)
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、从后往前,那就是右中左这个顺序进行累加,然后依次累加返回就行