669. 修剪二叉搜索树 - 力扣(LeetCode)669. 修剪二叉搜索树
思路:
1、采用前序遍历,中左右的方式。
2、当遇到节点有大于或小于,超出限制范围,根据二叉搜索树的性质,思考其左右子树是否也不符合,或者符合,采用递归方式,并将其新的根节点存储下来,返回其新节点。
3、将当前根节点的左子树的指向,指向要新返回也就是递归的节点。
4、当前根节点右子树同理。
5、最后将本根节点返回给上一节点。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high)
{
//一步一步的删除
if (root == NULL)return NULL;//采用前序遍历,一个一个往下走
if (root->val < low) {
//若当前值小于最低值,但其右子树的值,不一定都小,就继续判断我的右子树的值,并将其返回给上一节点
TreeNode* right = trimBST(root->right, low, high);
return right;
}
if (root->val > high)
{
TreeNode* left = trimBST(root->left, low, high);
return left;
}
root->left = trimBST(root->left, low, high);//让当前根节点的左子树接入符合条件的左孩子;
root->right = trimBST(root->right, low, high);//让当前根节点接入符合条件的右孩子;
return root;//必须将root返回,这样才会有上一节点才有当前节点,函数体才能结束。
}
};
108.将有序数组转换为二叉搜索树 108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
思路:
1、为了能够使其成为平衡二叉搜索树
2、每回将数组中间节点作为根节点,然后分开左右数组,并分别用其构造左右子树。
3、不管是左右数组,是偶数还是奇数都是满足的。
4、采用平分的方式对数组进行平分,并采用左闭有闭区间的方式,然后再将本根节点返回。
class Solution {
private:
TreeNode* traversal(vector<int>& nums, int left, int right)
{
if (left > right)return NULL;
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) {
TreeNode* root = traversal(nums, 0, nums.size() - 1);
return root;
}
};
538.把二叉搜索树转换为累加树 538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
思路:
采用类似后序遍历+双指针的方式,通过一个指针存储上一个节点的值,然后通过本两者相加。
class Solution {
private:
int pre = 0; // 记录前一个节点的数值
void traversal(TreeNode* cur) { // 右中左遍历
if (cur == NULL) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};
一刷二叉树总结
二叉树构造,一定是先构造中间节点。
一定理解二叉树前中后序的遍历,一般是根据二叉树的中间节点来坐文章。
什么是完全二叉树,什么是满二叉树,二叉搜索树,平衡二叉树。
理解递归遍历,根据递归遍历三部曲,还有层次遍历。
还是得要进行二刷才能对基础巩固。