【Day23】二叉树part9—修建二叉搜索树、将有序数组转换为二叉搜索树、把二叉搜索树转换为累加树以及二叉树总结篇

今天是二叉树的最后一部分,开冲!!!

今日任务:

  • 669.修建二叉搜索树
  • 108.将有序数组转换为二叉搜索树
  • 538.把二叉搜索树转为累加树
  • 总结篇

题目一:669.修剪二叉搜索树

Leetcode题目:【669.修剪二叉搜索树】

在这里插入图片描述

思路:
1、终止条件:节点为NULL,因为一定要遍历完整棵树才可以,这个与上面做的删除特定节点题不同
2、内容处理:
(1)如果节点的值比low小了,应该往右查找(因为左侧会更小,一定会被删除的,这就用到了二叉搜索树的特性了);
(2)节点值如果比high大了,应该往左查找(因为右边的节点一定是不符合情况的)。

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root == NULL) return root;
        if(root -> val < low){
            TreeNode* right = trimBST(root -> right, low, high);
            return right; 
        }else 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;
    }
};

一次性AC了,牛逼!!!

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

Leetcode题目:【108.将有序数组转换为二叉搜索树】

在这里插入图片描述
题目中需要构造平衡二叉搜索树:

一般我们如何去构造二叉树呢?
(1)选取一个中间节点,将数组分为两个区间;
(2)递归去遍历左区间,构成左子树;
(3)递归遍历右区间,构成右子树。

注意此题的终止条件为left > right(左区间的值大于右区间的值)

class Solution {
public:
    TreeNode* traversal(vector<int>& nums, int left, int right){
        if(left > right) return NULL;
        int mid = (left + right)/2;
        TreeNode* node = new TreeNode(nums[mid]);
        node -> left = traversal(nums, left, mid - 1);
        node -> right = traversal(nums, mid + 1, right);
        return node;
    }

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

题目三:538.把二叉搜索树转为累加树

Leetcode题目:【538.把二叉搜索树转为累加树】

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int pre = 0;
    TreeNode* convertBST(TreeNode* root) {
        // 按照右、中、左的顺序进行遍历
        if(root == NULL) return NULL;
        convertBST(root -> right);
        root -> val += pre;
        pre = root -> val;
        convertBST(root -> left);
        return root;
    }
};

四、二叉树总结:

参考:【代码随想录值二叉树总结篇】

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值