669. 修剪二叉搜索树
采用前序遍历,再根据要求可得:第一个低于下限值的左子节点全部舍弃,高于上限值的右子节点全部舍弃
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(!root) return root;
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;
}
};
108.将有序数组转换为二叉搜索树
. 这题关键在于要转换成平衡二叉树,在看到输入参数有数组突然就想到找到中间节点再分成左右节点进行迭代。
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.empty()) return nullptr;
auto it = nums.begin() + nums.size() / 2;
TreeNode* root = new TreeNode(*it);
vector<int> LeftNums(nums.begin(), it);
vector<int> RightNums(it + 1, nums.end());
root->left = sortedArrayToBST(LeftNums);
root->right = sortedArrayToBST(RightNums);
return root;
}
};
538.把二叉搜索树转换为累加树
根据实例可看出是右中出遍历,那么按照递归的格式可以出模板;累加又得保存上一个节点(或者节点的值也可以),那么可写出下面代码:
class Solution {
public:
TreeNode* pre = new TreeNode();
TreeNode* convertBST(TreeNode* root) {
if(!root) return nullptr;
//右中左
convertBST(root->right);
//TODO
root->val += pre->val;
pre = root;
convertBST(root->left);
return root;
}
};