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

1|0题解思路:

二叉搜索树(Binary Search Tree)是指一棵空树或具有如下性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值
  • 任意节点的左、右子树也分别为二叉搜索树
  • 没有键值相等的节点

基于以上性质,我们可以得出一个二叉搜索树的特性:二叉搜索树的中序遍历结果为递增序列。

1|1那么现在题目给了我们一个递增序列,要求我们构造一棵二叉搜索树,就是要我们实现这一特性的逆过程。

2|0递归设计

2|1函数作用:通过上述解题过程我们可以明确该问题的子问题是:构造树的每个节点以及该节点的左右子树。因此,递归函数的作用很明显:

  1. 选取要构造关系的节点并创建它
  2. 构造该节点的左子树
  3. 构造该节点的右子树
  4. 函数的输入为递增数组,函数的返回为完成构造的节点。

2|2何时结束

当输入的递增数组为空时,只能构成一棵空树,此时返回空节点。

2|3何时调用

当构造节点的左右子树时,对递增数组进行拆分并进行递归调用。

3|0实现

Java

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { int[] nums; public TreeNode helper(int left, int right) { if (left > right) return null; // always choose left middle node as a root int p = (left + right) / 2; TreeNode root = new TreeNode(nums[p]); root.left = helper(left, p - 1); root.right = helper(p + 1, right); return root; } public TreeNode sortedArrayToBST(int[] nums) { this.nums = nums; return helper(0, nums.length - 1); } }

python:

# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def sortedArrayToBST(self, nums: List[int]) -> TreeNode: if not nums: return None # 找到中点作为根节点 mid = len(nums) // 2 node = TreeNode(nums[mid]) # 左侧数组作为左子树 left = nums[:mid] right = nums[mid+1:] # 递归调用 node.left = self.sortedArrayToBST(left) node.right = self.sortedArrayToBST(right) return node

链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/


__EOF__

本文作者程序员小宇
本文链接https://www.cnblogs.com/treasury/p/12659505.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   程序员小宇  阅读(393)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示