1. 题目
2. 解法
2.1 解法一(递归)
- 时间复杂度,n为二叉树的结点数目,因为几乎每一个结点都需要被检查
- 空间复杂度
- 代码
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr) { // 当前结点为空结点,直接返回空结点
return nullptr;
}
if (root->val < low) { // 如果结点的值小于low,那么说明该结点及它的左子树都不符合要求,我们返回对它的右结点作为修剪后的结果
return trimBST(root->right, low, high);
}
else if (root->val > high) { // 那么说明该结点及它的右子树都不符合要求,我们返回对它的左子树进行修剪后的结果
return trimBST(root->left, low, high);
}
else { // 如果结点的值位于区间[low, high],我们将结点的左结点设为对它的左子树修剪后的结果,右结点设为对它的右子树进行修剪后的结果。
root -> left = trimBST(root->left, low, high);
root -> right = trimBST(root->right, low, high);
return root;
}
}
};
2.2 解法二(迭代)
- 时间复杂度,n为二叉树的结点数目
- 空间复杂度
- 代码
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
// 先对root内的值进行判断,保证一个合法的root
while (root && (root->val < low || root->val > high)) { // 非空树,值不在区间内
if (root->val < low) {
root = root->right; // 使用右子树连接
} else {
root = root->left; // 使用左子树连接
}
}
if (root == nullptr) { // root是空树|| 利用while循环检查下来,没有在区间之内的树
return nullptr;
}
// 对root一直往下,从左子树开始判断
for (auto node = root; node->left; ) { // node初值为root, node->left不为空时进入循环, 没有累加条件,累加条件在循环体内
if (node->left->val < low) {
node->left = node->left->right;
} else {
node = node->left; // 继续向左子树进行遍历
}
}
// 对root一直往下,从右子树开始判断
for (auto node = root; node->right; ) {
if (node->right->val > high) {
node->right = node->right->left;
} else {
node = node->right;
}
}
return root;
}
};