669. 修剪二叉搜索树
题目描述
思路分析
那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点0从二叉树中移除)
因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。
但是有返回值,更方便,可以通过递归函数的返回值来移除节点。
-
如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
-
如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。
-
处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。
大于high的情况类比
代码
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr) return nullptr;
if (root->val < low) return trimBST(root->right, low, high);
if (root->val > high) return trimBST(root->left, low, high);
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
108.将有序数组转换为二叉搜索树
题目描述
思路分析
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
代码
class Solution {
private:
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;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums, 0, nums.size() - 1);
}
};
538.把二叉搜索树转换为累加树
题目描述
思路分析
一棵二叉搜索树,换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13]
代码
class Solution {
private:
int pre = 0;
void traversal(TreeNode* root) {
if (root == nullptr) return;
traversal(root->right);
root->val += pre;
pre = root->val;
traversal(root->left);
return;
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};