首页 > 其他分享 >108. 将有序数组转换为二叉搜索树

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

时间:2023-04-12 10:44:48浏览次数:30  
标签:right TreeNode nums mid 二叉 108 数组 root left

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

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

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if(nums.empty()) return nullptr;
        //找根节点
        int root_index = nums.size()/2;
        auto it = nums.begin() + root_index;

        TreeNode *root = new TreeNode(*it);
        vector<int> nums_left(nums.begin(),it);
        root->left = sortedArrayToBST(nums_left);
        vector<int> nums_right(it+1,nums.end());
        root->right = sortedArrayToBST(nums_right);
        return root;
    }
    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;
    }
    TreeNode* sortedArrayToBST1(vector<int>& nums) {
        TreeNode* root = traversal(nums, 0, nums.size() - 1);
        return root;
    }
    TreeNode* sortedArrayToBST2(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);                    // 0为左区间下标初始位置
        rightQue.push(nums.size() - 1);     // 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];       // 将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;
    }
};

标签:right,TreeNode,nums,mid,二叉,108,数组,root,left
From: https://www.cnblogs.com/lihaoxiang/p/17308976.html

相关文章

  • 669. 修剪二叉搜索树
    给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在唯一的答案。所以结果应当返回修剪好......
  • 哈希表:剑指 Offer 03. 数组中重复的数字
    题目描述:找出数组中重复的数字。在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。   限制:2<=n<=100000 哈希表/Set利用数据......
  • C语言矩阵顺时针旋转90度和力扣34. 在排序数组中查找元素的第一个和最后一个位置
    #include<iostream>usingnamespacestd;#defineM5#include<stdlib.h>//原矩阵,某元素第n行第m列,;顺时针旋转90度后,位置变成倒数第n列,第m行//即先转置再水平翻转intn=0;voidrotation_90(intmatrix[][M],intn){ for(inti=0;i<n;i++) { for(intj=i;j<M;j++)......
  • 第九篇 手写原理代码 - 数组 【 实现 forEach、map、filter、every、some 】
    1、forEachArray.prototype.my_forEach=function(callback){for(leti=0;i<this.length;i++){callback(this[i],i,this);}};2、mapArray.prototype.my_map=function(callback){constarr=[];for(leti=0;i<this.length;......
  • 约瑟夫环问题---&解题方法 静态单链表&一维数组
      importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);intn=input.nextInt();intm=input.nextInt();int[]ant=newint[150];for(int......
  • python 开数组
     列表推导式~N=int(10)#二维数组a=[[jforiinrange(N)]forjinrange(20)]a[1][1]=8a[1][2]=2foriinrange(N):forjinrange(N):print(a[i][j],end='')print('')#多维数组a=[[[iforjinrange(N)]forkinrange(3)]......
  • PAT Basic 1087. 有多少不同的值
    PATBasic1087.有多少不同的值1.题目描述:当自然数 \(n\) 依次取\(1、2、3、……、N\) 时,算式 \(⌊n/2⌋+⌊n/3⌋+⌊n/5⌋\) 有多少个不同的值?(注:\(⌊x⌋\) 为取整函数,表示不超过 \(x\) 的最大自然数,即 \(x\) 的整数部分。)2.输入格式:输入给出一个正整数 \(N\)(\(......
  • PAT Basic 1086. 就不告诉你
    PATBasic1086.就不告诉你1.题目描述:做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。2.输入格式:输入在第一行给出两个不超过1000的正整数A和B,其间以空格分隔。......
  • PAT Basic 1085. PAT单位排行
    PATBasic1085.PAT单位排行1.题目描述:每次PAT考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。2.输入格式:输入第一行给出一个正整数N(\(≤10^5\)),即考生人数。随后N行,每行按下列格式给出一个考生的信息:准考证号得分学校其中准考证号是由......
  • 多维数组的使用(三)
    内存解析二维数组本质上是元素类型是一维数组的一维数组。int[][]arr={{1},{2,2},{3,3,3},{4,4,4,4},{5,5,5,5,5}};//1、声明二维数组,并确定行数和列数int[][]arr=newint[4][5];//2、确定元素的值for(inti=0;i<arr.length;i+......