题解思路:
二叉搜索树(Binary Search Tree)是指一棵空树或具有如下性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值
- 任意节点的左、右子树也分别为二叉搜索树
- 没有键值相等的节点
基于以上性质,我们可以得出一个二叉搜索树的特性:二叉搜索树的中序遍历结果为递增序列。
那么现在题目给了我们一个递增序列,要求我们构造一棵二叉搜索树,就是要我们实现这一特性的逆过程。
递归设计
函数作用:通过上述解题过程我们可以明确该问题的子问题是:构造树的每个节点以及该节点的左右子树。因此,递归函数的作用很明显:
- 选取要构造关系的节点并创建它
- 构造该节点的左子树
- 构造该节点的右子树
- 函数的输入为递增数组,函数的返回为完成构造的节点。
何时结束
当输入的递增数组为空时,只能构成一棵空树,此时返回空节点。
何时调用
当构造节点的左右子树时,对递增数组进行拆分并进行递归调用。
实现
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/
来源:https://www.cnblogs.com/treasury/p/12659505.html