题目:修剪二叉搜索树
做错的原因:我在前序遍历二叉树的过程中只要碰到小于low的节点就直接返回右子树,在大于high的节点就直接返回左子树,这样做不能确保返回的左右子树是否满足要求,因此需要对返回的左右子树继续按照单层的判断逻辑进行判断
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
if(root->val > high)
{
TreeNode* left = trimBST(root->left,low,high);
return left;
}
if(root->val < low)
{
TreeNode* right = trimBST(root->right,low,high);
return right;
}
root->left = trimBST(root->left,low,high);
root->right = trimBST(root->right,low,high);
return root;
}
};
题目:将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
思路:每次找到序列的中心点,序列的左边即为左子树所对应的序列,右边为右子树所对应的序列
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size() == 0) return nullptr;
int index = nums.size()/2;
TreeNode* root = new TreeNode(nums[index]);
vector<int>left_nums {nums.begin(),nums.begin()+index};
vector<int>rigth_nums{nums.begin()+ index+ 1,nums.end()};
root->left = sortedArrayToBST(left_nums);
root->right = sortedArrayToBST(rigth_nums);
return root;
}
};
题目:把二叉搜索树转换为累加树
538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
思路:采用的遍历方式是右中左
就可以很好的解决这个问题
class Solution {
public:
int sums = 0;
TreeNode* convertBST(TreeNode* root) {
if(root == nullptr) return nullptr;
root->right = convertBST(root->right);
root->val += sums;
sums = root->val;
root->left = convertBST(root->left);
return root;
}
};
评论