代码随想录算法训练营第二十三天 | 修建二叉搜索树

本文介绍了力扣编程题目中的三个挑战:修剪二叉搜索树、将有序数组转为二叉搜索树和二叉搜索树转为累加树,强调了递归、搜索树特性及遍历方法的重要性。

目录

力扣题目

力扣题目记录

669. 修剪二叉搜索树

108.将有序数组转换为二叉搜索树      

538.把二叉搜索树转换为累加树

总结


力扣题目

用时:1.5h

1、669. 修剪二叉搜索树

2、108.将有序数组转换为二叉搜索树

3、538.把二叉搜索树转换为累加树


力扣题目记录

669. 修剪二叉搜索树

        这个题比添加元素和删除元素复杂很多,虽说如此,但还是可以画图模拟一下,如果一个父节点在区间左侧,那么它的左子树全部都不行,右子树可能部分可以;如果父节点在区间右侧,那么它的右子树全部都不行,左子树可能部分可以。因为是部分可以,所以要返回递归的结果

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr ) return nullptr;
        if (root->val < low) {
            TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
            return right;
        }
        if (root->val > high) {
            TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
            return left;
        }
        root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
        root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
        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) {
        TreeNode* root = traversal(nums, 0, nums.size() - 1);
        return root;
    }
};

538.把二叉搜索树转换为累加树

        这个题目不要局限思维,直接用右中左的顺序进行遍历,然后加上双指针记录前一个节点的值就行了

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、付费专栏及课程。

余额充值