代码随想录算法训练营day23 | LeetCode 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树

669. 修剪二叉搜索树(题目链接:力扣)

思路:有被难到这道题,一开始考虑的就是删除某个不满足的节点后左右子树怎么处理,其实只要处理该节点的左子树或者右子树(可以细想一下),另一颗子树直接删掉就好了,麻烦就麻烦在进入子树之后,以该节点为根节点的左右子树又该怎么处理,想来想去没想出来,后来看了解析,我开始的这种方法天然对应迭代法,因为该根节点满足条件,只要把左子树中太小了的删掉就可以了,这就只要删除最左边的那些节点就可以,右子树就只要删除最右边那些太大了的即可。

TreeNode* trimBST(TreeNode* root, int low, int high) {
    if(root == NULL) return NULL;
    while(root != NULL && (root->val < low || root->val > high)){
        if(root->val < low) root = root->right;
        else root = root->left;
    }
    TreeNode* cur = root;
    while(cur != NULL){
        while(cur->left && cur->left->val < low){
            cur->left = cur->left->right;
        }
        cur = cur->left;
    }
    cur = root;
    while(cur != NULL){
        while(cur->right && cur->right->val > high){
            cur->right = cur->right->left;
        }
        cur = cur->right;
    }
    return root;
}

还有一种代码非常简洁的递归法(首次既进入子树,又再次进入子树取得返回值)。

TreeNode* trimBST(TreeNode* root, int low, int high) {
    if(root == NULL) return NULL;
    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. 将有序数组转换为二叉搜索树(题目链接:力扣)

思路:简单的用数组构造二叉树,每次取数组中间的值生成根节点即可构造平衡树。

TreeNode* traversal(vector& nums, int start, int end){
    if(start > end) return NULL;
    if(start == end){
        return new TreeNode(nums[start]);
    }
    int rootIndex = (start+end)/2;
    TreeNode* root = new TreeNode(nums[rootIndex]);
    root->left = traversal(nums, start, rootIndex-1);
    root->right = traversal(nums, rootIndex+1, end);
    return root;
}

TreeNode* sortedArrayToBST(vector& nums) {
    return traversal(nums, 0, nums.size()-1);
}

538. 把二叉搜索树转换为累加树(题目链接:力扣)

思路:直接反着中序遍历把上一个加到本节点的值上来就可以了,递归和迭代都非常简单。

void traversal(TreeNode* root){
    if(root->right) traversal(root->right);
    if(pre) root->val += pre->val;
    pre = root;
    if(root->left) traversal(root->left);
}

TreeNode* convertBST(TreeNode* root) {
    if(root==NULL) return root;
    traversal(root);
    return root;
}

你可能感兴趣的:(算法,leetcode,职场和发展)