3道题目
669. 修剪二叉搜索树
108. 将有序数组转换为二叉搜索树
538. 把二叉搜索树转换为累加树
解题理解
669
没思路,想用昨天的450答案也写不进去,没想到题解写的很简洁,总体思路是若当前节点不在指定范围内(范围是左闭右闭),观察在范围左,就递归右子树;在范围右,就递归左子树;在范围里,也需要分别递归左右子树。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int L, int R) {
if(root == nullptr) return root;
if(root->val < L){
TreeNode* right = trimBST(root->right, L, R);
return right;
}
if(root->val > R){
TreeNode* left = trimBST(root->left, L, R);
return left;
}
root->left = trimBST(root->left, L, R);
root->right = trimBST(root->right, L, R);
return root;
}
};
108
从左中间开始构造二叉搜索树,不管是不是奇数个元素,都能保证以中间为根的左右子树高度差不超过1。
class Solution {
public:
TreeNode* traversal(vector<int>& nums, int left, int right){
if(left > right) return nullptr;
int mid = left + (right - left) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = traversal(nums, 0, nums.size() - 1);
return root;
}
};
538
没思路,没想到可以反中序遍历,这样就可以在原树上一次遍历出结果。
private:
int pre = 0;;
void traversal(TreeNode* root) {
if(root == nullptr) return;
traversal(root->right);
root->val += pre;
pre = root->val;
traversal(root->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};