目录
LeetCode 669. 修剪二叉搜索树
思想:本题其实比较简单,首先就是遍历整棵树,遇到节点的值如果不在所要求的区间范围内的话,就进行以下处理;如果节点值大于右边界,就返回当前节点的左节点;反之就返回当前节点的右节点。
代码如下:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (!root) return nullptr;
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;
}
LeetCode 108. 将有序数组转换为二叉搜索树
题目链接:LeetCode 108. 将有序数组转换为二叉搜索树
思想:其实本题特别像之前的一道根据前中序序列构造二叉树,大体上与其十分相似,只是确定root节点的时候,取数组最中间的元素即可。
代码如下:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if (nums.size() == 0) return NULL;
int rootIndex = nums.size() / 2;
int rootValue = nums[rootIndex];
TreeNode* cur = new TreeNode(rootValue);
if (nums.size() == 1) return cur;
vector<int> left(nums.begin(), nums.begin() + rootIndex);
vector<int> right(nums.begin() + rootIndex + 1, nums.end());
cur->left = sortedArrayToBST(left);
cur->right = sortedArrayToBST(right);
return cur;
}
LeetCode 538. 把二叉搜索树转换为累加树
题目链接:LeetCode 538. 把二叉搜索树转换为累加树
思想:本题的意思其实是,将一个二叉搜索树转化为升序数组的话,例如[1,2,3],其对应的累加树序列就是,每个数加其本身以及大于本身的元素,即[6,5,1]。那这样的就是每个数加其本身以及后面的数。我们知道中序遍历出来的是升序二叉搜索树数组,那么反中序遍历也就是右中左的话,出来的就是降序二叉搜索树数组,就可以从前一直加到最后了。
代码如下:
int pre = 0;
void traversal(TreeNode* cur){
if(!cur) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->left);
}
TreeNode* convertBST(TreeNode* root) {
if (!root) return NULL;
traversal(root);
return root;
}