leetcode 108.将有序数组转换为二叉搜索树
主要通过寻找分割点,将分割点作为当前节点,然后递归左区间和右区间,因为是有序数组,因此将数组中间位置作为分割点,当分割的数组长度为偶数时,中间节点有两个,取不同的中间节点会得到不同的二叉搜索树。
-
确定递归函数的参数和返回值
TreeNode* traversal(vector<int>& nums, int left, int right)
-
确定递归终止条件, 当左边界大于右边界时,当前区间无效,返回空节点。
if (left > right) return nullptr;
-
确定单层的递归逻辑
int mid = (left + right)/2; TreeNode* node = new TreeNode(nums[mid]); node->left = traversal(nums, left, mid - 1); node->right = traversal(nums, mid + 1, right); return node;
每次取区间的中间值作为分割点,当区间长度为偶数时,中间位置有两个,选择较小的一个。递归地对左半部分区间
[left, mid - 1]
进行相同的操作,生成的左子树赋给当前节点的左子节点,同理右半部分区间[mid + 1, right]
生成的右子树赋给当前节点的右子节点。最后返回当前构建的节点作为该子树的根节点。