108. 将有序数组转换为二叉搜索树
题目描述:
给你一个整数数组 nums
,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树。
概念回顾:
一、什么是二叉搜索树?
二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。
BST是一棵满足如下性质的树:
- 非空左子树的所有键值小于其根结点的键值。
- 非空右子树的所有键值大于其根结点的键值
- 左、右子树都是二叉搜索树。
二、二叉搜索树的性质
二叉搜索树的中序遍历序列是升序序列,例:
中序遍历序列:[7 9 10 15 18 20 22]
三、平衡二叉树
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
解题思路
递归遍历给定的升序序列,将中间数值作为根节点,再递归构建节点的左子树和右子树,当序列为空时,递归返回。
注意,我们选择中间节点的时候可能会有两种情况,分别是序列是奇数长度或者序列是偶数长度。如果序列是偶数长度我们可以选择中间左边的数字来构建节点,或者选择中间右边的数字来构建节点。
选择中间左边的节点:mid = (left+right)/2
选择中间右边的节点:mid=(left+right + 1)/2
代码:
TreeNode recursive(vector<int>& nums, int left, int right){
if(left>right)
return nullptr;
int mid = (left + right)/2;
TreeNode* treenode = new TreeNode(nums[(left+right)/2])
treenode->left = recursive(nums, left, mid-1);
treenode->right = recursive(nums, mid+1, right);
return treenode;
}