day21 二叉树09
最后一天的二叉树!
669. 修剪二叉搜索树
这个看起来比较难
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (!root) return nullptr;
if (root->val > high) {
// 寻找符合区间[low, high]的节点
TreeNode* left = trimBST(root->left, low, high);
return left;
}
else if (root->val < low) {
// 寻找符合区间[low, high]的节点
TreeNode* right = trimBST(root->right, low, high);
return right;
}
// root->left接入符合条件的左孩子
root->left = trimBST(root->left, low, high);
// root->right接入符合条件的右孩子
root->right = trimBST(root->right, low, high);
return root;
}
};
☆这里的方式比较新,在不知不觉中完成了递归。理解向上返回TreeNode*的关系链。
108. 将有序数组转换为二叉搜索树
还要高度平衡,容易在输入是个数组,可以一开始就确定root是谁,用递归也很方便。
复习了一下如何构造一个 子vector,
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
int len = nums.size();
int mid = len / 2;
TreeNode* root = new TreeNode(nums[mid]);
if (mid > 0) {
vector<int> nums1 = vector<int>(nums.begin(), nums.begin() + mid);
root->left = sortedArrayToBST(nums1);
}
if (mid + 1 < len) {
vector<int> nums2 = vector<int>(nums.begin() + mid + 1, nums.end());
root->right = sortedArrayToBST(nums2);
}
return root;
}
};
538. 把二叉搜索树转换为累加树
用了个全局变量,再加上递归,完事,easy。
class Solution {
public:
TreeNode* post = nullptr;
TreeNode* convertBST(TreeNode* root) {
if (!root) return nullptr;
convertBST(root->right);
if (post) root->val = post->val + root->val;
post = root;
convertBST(root->left);
return root;
}
};