1 修剪二叉搜索树
迭代:
class Solution {
//迭代法:
//1 将节点移动到[L,H]内
//2 处理左子树
//3 处理右子树
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
//1.移动节点
while(root != nullptr && (root->val < low || root->val > high)){
if(root->val < low) root = root->right;
if(root->val > high) root = root->left;
}
//2.处理左子树
TreeNode* cur = root;
while(cur != nullptr){
while(cur->left && cur->left->val < low){
cur->left = cur->left->right; //将不符合条件的节点删除
}
cur = cur->left;//移动指针继续进行循环
}
//3.处理右子树
cur=root;
while(cur != nullptr){
while(cur->right && cur->right->val > high) cur->right = cur->right->left;
cur = cur->right;
}
return root;
}
};
递归:
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
//终止条件
if(root == nullptr) return nullptr;
//处理逻辑
//值小往左子树找,找到目标值,将其右子树(可能有符合条件的)当作整体继续寻找,然后将找到的返回给目标值的父节点
if(root->val > high){
TreeNode* leftNode = trimBST(root->left,low,high);
return leftNode;
}
if(root->val < low){
TreeNode* rightNode = trimBST(root->right,low,high);
return rightNode;
}
root->left = trimBST(root->left,low,high);
root->right = trimBST(root->right,low,high);
return root;
}
};
2 将有序数组转换为二叉搜索树
参考构造二叉树(进行切割选出根节点和左右子树)
class Solution {
//左闭右闭
public:
TreeNode* traversal(vector<int>& nums,int left,int right){
if(left > right) return nullptr;
//int mid = (left+right)/2;
int mid = left + ((right-left)>>1);
TreeNode* node = new TreeNode(nums[mid]);
node->left = traversal(nums,left,mid-1);
node->right = traversal(nums,mid+1,right);
return node;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = traversal(nums,0,nums.size()-1);
return root;
}
};
3 把二叉搜索树转换为累加树
递归:
class Solution {
//数组[1,2,33]求累加,就后序从后往前遍历
//二叉搜索树:中序(左中右)是升序,那么就倒序遍历(右中左)
public:
TreeNode* pre = nullptr;
void traversal(TreeNode* cur){
if(cur == nullptr) return;
traversal(cur->right);
if( pre != nullptr){
cur->val += pre->val;
}
pre = cur;
traversal(cur->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};
迭代
class Solution {
//数组[1,2,33]求累加,就后序从后往前遍历
//二叉搜索树:中序(左中右)是升序,那么就倒序遍历(右中左)
public:
TreeNode* convertBST(TreeNode* root) {
stack<TreeNode*> stk;
if(root == nullptr) return root;
TreeNode* pre = nullptr;
TreeNode* cur = root;
while(cur != nullptr || !stk.empty()){
if(cur != nullptr){
stk.push(cur);
cur = cur->right;
}else{
cur = stk.top();stk.pop();
if(pre!=nullptr){
cur->val += pre->val;
}
pre = cur;
cur = cur->left;
}
}
return root;
}
};