当前位置: 首页 > news >正文

将有序数组转化为二叉树

本文参考代码随想录

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

思路:寻找分割点,分割点作为当前节点,然后递归左区间和右区间。

递归法

取中间值为root,递归左区间成为root的左孩子,右区间成为root的右孩子,最后返回root

class Solution {
private:
    TreeNode* traversal(vector<int>& nums,int left, int right){
        //若数组为空则返回
        if(left > right) return nullptr;
        int mid = left + (right - left) / 2;//防止遇到INT_MAX长度溢出
        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;
    }
};

迭代法

通过三个队列来模拟,一个队列放遍历的节点,一个队列放左区间下标,一个队列放右区间下标

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if(nums.size() == 0) return nullptr;

        TreeNode* root = new TreeNode(0);
        queue<TreeNode*> nodeQue;//存放遍历的节点
        queue<int> leftQue;//存放左区间下标
        queue<int> rightQue;//存放右区间下标
        nodeQue.push(root);
        leftQue.push(0);
        rightQue.push(nums.size() - 1);

        while(!nodeQue.empty()){
            TreeNode* curNode = nodeQue.front();
            nodeQue.pop();
            int left = leftQue.front();
            leftQue.pop();
            int right = rightQue.front();
            rightQue.pop();
            int mid = left + (right - left) / 2;

            curNode->val = nums[mid];//为根节点赋值

            if(left <= mid - 1){
                //左区间存在,则处理左区间
                curNode->left = new TreeNode(0);
                nodeQue.push(curNode->left);
                leftQue.push(left);
                rightQue.push(mid - 1);
            }

            if(right >= mid + 1){
                //右区间存在,则处理右区间
                curNode->right = new TreeNode(0);
                nodeQue.push(curNode->right);
                leftQue.push(mid + 1);
                rightQue.push(right);
            }
        }
        return root;
    }
};

相关文章:

  • Java面试黄金宝典33
  • 深入学习Pytorch:第一章-初步认知
  • 字符串——面试考察高频算法题
  • 腾讯云 阿里云服务器运用宝塔搭建fprc服务器报错 :frp使用http拒绝连接 frpc.exe -c frpc.toml 拒绝访问 解决方法
  • java: 错误: 不支持发行版本 22 无效的发行版本
  • 从代码上深入学习GraphRag
  • 【愚公系列】《高效使用DeepSeek》051-产品创新研发
  • 【stm32f4】UART串口通信(stm32hal库)
  • 练习题:122
  • Matplotlib:数据可视化的艺术与科学
  • Mixed Content: The page at https://xxx was loaded over HTTPS
  • MCP服务器:AI与外部工具交互的桥梁——Python和代理AI工具集成指南
  • vector的模拟实现
  • leetcode数组-螺旋矩阵Ⅱ
  • NSSCTF [FSCTF 2023]Fi3h
  • Python语言的测试用例设计
  • 【C#深度学习之路】如何使用C#实现Stable Diffusion的文生图功能
  • Linux文件特殊权限管理及进程和线程
  • Roo Code(前身为 Roo Cline)一个 AI 驱动的自主编码代理
  • C++stl map容器详解
  • 域名购买万网/网站关键字优化公司
  • WordPress能放小程序吗/杭州网络排名优化
  • 开发手机端网站模板下载/seo的工作流程
  • 做网站 广告费 步骤/江门seo网站推广
  • 手表网站制作模板/黄页推广2021
  • 免费做app网站/长沙seo全网营销