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

leetcode每日一练-第108题-将有序数组转换为二叉搜索树

 

 

一、思路

递归

二、解题方法

在给定中序遍历序列数组的情况下,每一个子树中的数字在数组中一定是连续的,因此可以通过数组下标范围确定子树包含的数字,下标范围记为 [left,right]。对于整个中序遍历序列,下标范围从 left=0到 right=nums.size()−1。当 left>right 时,平衡二叉搜索树为空。

选择中间位置左边的数字作为根节点

三、code

class Solution {
public:TreeNode* sortedArrayToBST(vector<int>& nums) {return helper(nums,0,nums.size()-1);}TreeNode* helper(vector<int>& nums,int left,int right){if(left>right)//当左边界 left 大于右边界 right 时,意味着当前处理的区间为空,即没有元素可以用来构建子树了。这种情况下,我们返回 nullptr,表示当前子树为空树。{return nullptr;}int mid=(left+right+1)/2;//计算当前处理区间的中间位置,总是选择中间位置左边的数字作为根节点。这样可以保证构建的二叉搜索树是高度平衡的。TreeNode* root=new TreeNode(nums[mid]);//创建当前区间中间位置的元素值为根节点的二叉树节点。root->left=helper(nums,left,mid-1);//递归构建当前根节点的左子树,将左边界设为 left,右边界设为中间位置的前一个位置 mid - 1。root->right=helper(nums,mid+1,right);//递归构建当前根节点的右子树,将左边界设为中间位置的后一个位置 mid + 1,右边界设为 right。return root;}
};

 =========================================================================学到的知识:

前序遍历(Preorder Traversal):在二叉树中,先访问根节点,然后按照左子树、右子树的顺序递归遍历子树。在前序遍历中,根节点的访问顺序是最先的。

中序遍历(Inorder Traversal):在二叉树中,先按照左子树、根节点、右子树的顺序递归遍历子树。在中序遍历中,根节点的访问顺序位于左右子树之间。

后序遍历(Postorder Traversal):在二叉树中,先按照左子树、右子树、根节点的顺序递归遍历子树。在后序遍历中,根节点的访问顺序是最后的。

这三种遍历方式是深度优先搜索(DFS)的三种不同变种。它们分别有不同的应用场景:

  • 前序遍历:适用于需要先处理根节点再处理子节点的场景,比如复制整个树的结构或序列化为字符串。
  • 中序遍历:适用于二叉搜索树,可以将其按从小到大的顺序输出,比如查找树中第 k 小的元素。
  • 后序遍历:适用于释放二叉树的内存,先释放子节点再释放根节点,以防止访问已经释放的内存。

TreeNode* root = new TreeNode(nums[mid]);

这行代码用于创建一个新的二叉树节点,并将其值初始化为有序数组中间位置的元素 nums[mid] 

http://www.lryc.cn/news/107660.html

相关文章:

  • 王道《操作系统》学习(二)—— 进程管理(二)
  • Vulnhub: shenron: 3靶机
  • Kubernetes高可用集群二进制部署(二)ETCD集群部署
  • mysql主从复制及原理
  • MQTT服务器详细介绍:连接物联网的通信枢纽
  • 通过VBA宏合并Excel工作表
  • Mac 定时重启 TouchBar 脚本(缓解闪烁问题)
  • Redis主从复制、哨兵机制、集群分片
  • 字段填充策略 FieldFill
  • Docker run 启动容器报错
  • Golang之路---03 面向对象——类型断言
  • Atcoder 做题记录
  • C++之观察者模式(发布-订阅)
  • 无头单链表,有完整测试程序
  • 2023年第四届“华数杯”数学建模思路 - 案例:FPTree-频繁模式树算法
  • MySQL做分布式锁
  • Python学习笔记:变量类型、字符串基本操作
  • JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型
  • 【elementui】解决el-select组件失去焦点blur事件每次获取的是上一次选中值的问题
  • 通过了PMP考试,还有什么证书值得考?
  • 页面技术基础-html
  • /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28‘ not found
  • 解决SVN或GIT忽略提交文件的问题
  • Django框架之路由用法
  • 回文链表 LeetCode热题100
  • 如何在群晖NAS中使用cpolar内网穿透
  • 无头单向不循环链表和带头双向循环链表的创建
  • 超简单的fastapi链接websocket用例
  • MySQL详解
  • Vue [Day2]