题一:修剪二叉搜索树
题目链接: 修剪二叉搜索树
解题思路: 再递归得角度上来说,就是先判断当前结点得值在不在区间得左边还是右边还是中间,在左边得话再递归遍历右子树,在右边得话递归遍历左子树,在中间的话往左右子树两边双管齐下
解题代码:
var trimBST = function(root, low, high) {
if(!root)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;
};
题二:将有序数组转换为二叉搜索树
题目链接: 将有序数组转换为二叉搜索树
解题思路: 跟构造二叉树差不多,主要就是要确定好中间结点和左右区间。
解题代码:
var sortedArrayToBST = function(nums) {
let traversal = function(nums,left,right){
if(left > right) return null;
let mid = Math.floor((left + right) / 2);
let root = new TreeNode(nums[mid]);
root.left = traversal(nums,left,mid -1);
root.right = traversal(nums,mid+1,right);
return root;
}
let root = traversal(nums,0,nums.length-1);
return root;
};
题三: 把二叉树转换成累加树
题目链接: 把二叉树转换成累加树
解题思路: 跟卡哥说的一样,我用一个数组会做,但是用二叉树就不会了,后边仔细想了想,实际上就是一个反转的中序遍历,加上之前说的双指针的思路,这道题就是送分题。
var convertBST = function(root) {
var pre = 0;
let traversal = function (cur) {
if (!cur) return;
traversal(cur.right);
cur.val += pre;
pre = cur.val;
traversal(cur.left);
}
traversal(root);
return root;
};