669. 修剪二叉搜索树
题目链接:669. 修剪二叉搜索树
文档讲解:代码随想录
思路
前序遍历,如果遇到小于区间左端点值的结点,则遍历该结点的右节点,直到找到在区间内的结点并返回;如果遇到大于区间右端点值得结点,则遍历该节点得左结点,直到找到在区间内的结点并返回。
代码
class Solution {
public:
TreeNode *trimBST(TreeNode *root, int low, int high) {
if (root == NULL)
return NULL;
if (root->val < low){
TreeNode * right = trimBST(root->right, low, high);
return right;
}
if (root->val > high){
TreeNode* 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.将有序数组转换为二叉搜索树
题目链接:108.将有序数组转换为二叉搜索树
文档讲解:代码随想录
思路
构造二叉树本质是寻找分割点,分割点作为当前结点,然后递归左右区间。为了构造平衡二叉树,分割点选择区间的中间位置。
代码
class Solution {
public:
TreeNode *sortedArrayToBST(vector<int> &nums) {
return traversal(nums, 0, nums.size());
}
TreeNode *traversal(vector<int> &nums, int begin, int end) {
// 左闭右开区间
if (end <= begin)
return NULL;
// 第一步,找分割点
int rootIndex = begin + (end - begin) / 2;
int rootValue = nums[rootIndex];
TreeNode *root = new TreeNode(rootValue);
if (end - begin == 1)
return root;
// 第二步,分割区间
int leftBegin = begin;
int leftEnd = rootIndex;
int rightBegin = rootIndex + 1;
int rightEnd = end;
root->left = traversal(nums, leftBegin, leftEnd);
root->right = traversal(nums, rightBegin, rightEnd);
return root;
}
};
538.把二叉搜索树转换为累加树
题目链接:538.把二叉搜索树转换为累加树
文档讲解:代码随想录
思路
右中左的顺序遍历二叉树,使用全局变量记录累加和即可。
代码
class Solution {
public:
TreeNode *convertBST(TreeNode *root) {
traversal(root);
return root;
}
private:
int sum = 0;
void traversal(TreeNode *node) {
if (node == NULL)
return;
traversal(node->right);
sum += node->val;
node->val = sum;
traversal(node->left);
}
};