Day23——修剪二叉搜索树、将有序数组转化为二叉搜索树、把二叉搜索树转化为累加树

简介: Day23——修剪二叉搜索树、将有序数组转化为二叉搜索树、把二叉搜索树转化为累加树

前言


今日文案:

人生不是一支短短的蜡烛,而是一支暂时由我们拿着的火炬。我们一定要把它燃得十分光明灿烂,然后交给下一代的人们。

                                                                                                                     -肖伯纳

一、修剪二叉搜索树


力扣

解题思路:

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
    if(root==0)                //空节点直接返回
        {
            return root;
        }
        if(root->val<low)                        //找到的节点
        {
            root->right=trimBST(root->right,low,high);    //因为找到的点是太小了要删除。
            return root->right;                //往右寻找才能找到可以继续链接的节点
        }
        if(root->val>high)
        {
            root->left=trimBST(root->left,low,high);
            return root->left;
        }
        root->left=trimBST(root->left,low,high);
        root->right=trimBST(root->right,low,high);
            return root;

二、将有序数组转化为二叉搜索树


力扣

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

解题思路:

有序数组构建搜索树,我们关键是找到数组中的中点作为根节点,左边的数组是小的作为左子树,右边的数组是大的,作为右子树,如此递归构建。(一般是前序遍历)

class Solution {
public:
  TreeNode* trasversal(vector<int>nums,int left,int right)
    {
        if(left>right)                            //判断终止条件
        {
            return NULL;
        }
    int mid=(left+right)/2;                    //中点
        TreeNode*root=new TreeNode(nums[mid]);    //构建新节点
    root->left=trasversal(nums,left,mid-1);    //遍历,此处要注意传入指针的区间
        root->right=trasversal(nums,mid+1,right);
    return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
    TreeNode*root=trasversal(nums,0,nums.size()-1);
      return root;
    }
};

三、把二叉搜索树转化为累加树


力扣

这道题的题目就很难理解了,建议看视频。

class Solution {
public:
    int pre=0;
    void trasversal(TreeNode*cur)
    {
        if(cur==NULL)                    //遇到空节点就返回
        {
            return ;
        }
        trasversal(cur->right);        //遍历到右边最大的节点
        cur->val=cur->val+pre;        //相加
        pre=cur->val;                    //储存上一个节点的值
        trasversal(cur->left);          
    }
    TreeNode* convertBST(TreeNode* root) {
        trasversal(root);
        return root;
    }
};

只要找到了最大的节点(右下角),然后再从大往小遍历即可。

总结


构建二叉树最主要是前序遍历和选对传进数组边界条件。

相关文章
|
10月前
|
存储 监控 安全
推荐一款好用的十二导联Holter
十二导联 Holter 是一种便携式心电监测仪器,它可以记录患者心电信号在 24 小时或更长时间内的变化情况。
|
监控 安全 数据挖掘
AidLearning:手机端Python编程的神器
AidLearning:手机端Python编程的神器
449 0
|
安全 Linux PHP
让你10分钟就能看懂Linux文件权限(超级详细、超级简单!!!)
让你10分钟就能看懂Linux文件权限(超级详细、超级简单!!!)
1154 0
让你10分钟就能看懂Linux文件权限(超级详细、超级简单!!!)
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1014 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话