题目一 669. 修剪二叉搜索树
思路
var trimBST = function(root, low, high) {
if (!root) {
return null;
}
if (root.val < low) {
const right = trimBST(root.right, low, high);
return right;
}
if (root.val > high) {
const left = trimBST(root.left, low, high);
return left;
}
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
};
题目二 108. 将有序数组转换为二叉搜索树
思路
- 选取中间节点作为根节点
- 中间节点左侧作为跟节点的左子树,右侧数组作为右子树
var sortedArrayToBST = function(nums) {
const traversal = (nums, start, end) => {
if (start >= end) {
return null;
}
let mid = start + parseInt((end - start) / 2, 10);
const root = new TreeNode(nums[mid]);
root.left = traversal(nums, start, mid);
root.right = traversal(nums, mid + 1, end);
return root;
}
return traversal(nums, 0, nums.length);
};
题目三 538. 把二叉搜索树转换为累加树
思路
利用pre记录上一个节点,而且这个遍历是右中左来遍历。每次加上右侧数据,同时更新pre。
var convertBST = function(root) {
let pre = 0;
const traversal = root => {
if (!root) {
return root;
}
traversal(root.right);
root.val += pre;
pre = root.val;
traversal(root.left);
return root;
};
return traversal(root);
};