题解思路:
二叉搜索树(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/