669. 修剪二叉搜索树
文章链接:代码随想录
笔记
- 能想到递归的思想,但是没考虑不符合要求的元素的左右子树,直接删了
- 需要通过返回值来移除节点
- 递归:单层操作;左右子树
C++代码
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root==nullptr)return root;
//judge root
if(root->val < low ){
TreeNode* right =trimBST(root->right,low,high);//right
return right;
}
if(root->val > high ){
TreeNode* left =trimBST(root->left,low,high);//left
return left;
}
root->left=trimBST(root->left,low,high);
root->right=trimBST(root->right,low,high);
return root;
}
};
108. 将有序数组转换为二叉搜索树
文章链接:代码随想录
笔记
- 注意要判空
- 利用类似折半查找的方法递归建立平衡树
C++代码
class Solution {
TreeNode* traversal(vector<int>& nums,int low,int high){
if(low>high)return nullptr;//判空
int mid = low+((high-low)/2);//二分法
TreeNode* root = new TreeNode(nums[mid]);//新建节点
root->left=traversal(nums,low,mid-1);//左子树
root->right=traversal(nums,mid+1,high);//右子树
return root;
}
public:
//利用折半查找的思想,递归建树,平衡树
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root=traversal(nums,0,nums.size()-1);
return root;
}
};
538. 把二叉搜索树转换为累加树
文章链接:代码随想录
笔记
- 能判断出应该倒着来,但没想到是逆中序递归
- 错以为要先建树,太久不写生疏了
C++代码
class Solution {
int pre=0;//记上个节点的数据
void RNLtraversal(TreeNode* root){//逆中序递归
if(root==nullptr)return;
RNLtraversal(root->right);
root->val += pre;
pre=root->val;
RNLtraversal(root->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
pre=0;
RNLtraversal(root);
return root;
}
};