力扣刷题||669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树

文章介绍了如何使用前序遍历和递归方法解决LeetCode中的几道二叉树问题,包括修剪二叉搜索树以保持指定范围、将有序数组转换为平衡二叉搜索树以及将二叉搜索树转换为累加树。主要思路涉及二叉树的构造、遍历和递归操作。
摘要由CSDN通过智能技术生成

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;
    }
};

一刷二叉树总结

二叉树构造,一定是先构造中间节点。

一定理解二叉树前中后序的遍历,一般是根据二叉树的中间节点来坐文章。

什么是完全二叉树,什么是满二叉树,二叉搜索树,平衡二叉树。

理解递归遍历,根据递归遍历三部曲,还有层次遍历。

还是得要进行二刷才能对基础巩固。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值