1.修剪二叉搜索树
题目链接/文章讲解: 代码随想录
代码:(后序遍历)
(和我昨天发的那个删除结点基本上代码一样。但是上一题只需要删一个就可以返回,这题需要删完全部。所以本题采用后序遍历,就可以保证整棵树的结点都被处理过了。)
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root== NULL) return NULL;
// 后序遍历
// 左
root->left = trimBST(root->left,low,high);
// 右
root->right = trimBST(root->right,low,high);
// 中
if(root->val < low || root->val > high){
if(root->left == NULL) {
return root->right;
}else if(root->right == NULL){
return root->left;
}else{
TreeNode* node = root->right;
while(node->left){
node = node->left;
}
node->left = root->left;
return root->right;
}
}else{
return root;
}
}
};
思路:不知道为什么力扣不让delete。
代码:前序遍历
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == NULL) return NULL;
// 中
if(root->val > high){
return trimBST(root->left,low,high);
}else if(root->val < low){
return trimBST(root->right,low,high);
}else{
// 左
root->left = trimBST(root->left,low,high);
// 右
root->right = trimBST(root->right,low,high);
}
return root;
}
};
2.将有序数组转化为二叉搜索树
代码:(前序遍历)
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size() == 0) return NULL;
// 中
int mid = nums.size()/2;
TreeNode* node = new TreeNode(nums[mid]);
// 左闭右开
vector<int> left(nums.begin(),nums.begin() + mid);
vector<int> right(nums.begin() + mid + 1,nums.end());
// 左
node->left = sortedArrayToBST(left);
// 右
node->right = sortedArrayToBST(right);
return node;
}
};
思路:要构造平衡二叉搜索树。
首先,题上说这个数组已经排过序了,那我们只要按照中间结点的值,用比它小的数组值来构造左子树,用比它大的值来构造右子树。
又因为,要满足平衡树的条件,所以我们每次选的中间结点都是传进来的数组的最中间的数组,这样可以保证左右子树的结点数量不会相差超过1 。
代码:(也可以不用构造数组,而是把left和right作为递归函数的参数,这样可以减小时间复杂度和空间复杂度。)
class Solution {
public:
TreeNode* traversal(vector<int>& nums,int left,int right){
// 左闭右开
// 递归出口
if(left >= right){
return NULL;
}
// 中
int mid = left + (right - left)/2;
TreeNode* node = new TreeNode(nums[mid]);
// 左
node->left = traversal(nums,left,mid);
// 右
node->right = traversal(nums,mid + 1,right);
return node;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
int left = 0;
int right = nums.size();
return traversal(nums,left,right);
}
};
3. 把二叉搜索树转变为累加树
代码:反中序遍历,双指针
class Solution {
public:
TreeNode* pre = NULL;
TreeNode* convertBST(TreeNode* root) {
if(root == NULL) return NULL;
// 反中序遍历 右左中
// 右
convertBST(root->right);
// 中
if(pre != NULL){
root->val += pre->val;
}
pre = root;
// 左
convertBST(root->left);
return root;
}
};
思路:就其实把它想成数组就好了,只不过我们逆着中序遍历的顺序来加就好了。