这道题需要在递归的同时使用双指针。先找到一个区间的中间值,当作子树的父节点,再递归该中间值的左区间和右区间,用于生成该父节点的左子树和右子树。这就是此题的递归逻辑。而双指针就体现在每一层递归都要使用左指针和右指针来找到中间值。这里的双指针的移动逻辑与二分法中双指针的移动相同。所以我们也需要注意合法区间的选择。如果对二分法不熟悉的同学,可以看我这篇文章:二分查找注意事项-优快云博客。另外,这道题的递归函数的返回值为指向节点的指针,从而可以使用链表的连接操作将生成的父节点与上一层的父节点连接,最终构造成一棵树。大家可以结合我下面的代码及注释理解此题。
代码及注释如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* travel(vector<int>& nums,int left,int right){
//终止条件,我们事先规定合法区间为左闭右闭,则当左指针大于右指针时终止递归
if(left > right) return NULL;
//每递归到下一层就生成新节点
int mid = (left + right) / 2;//通过双指针二分,可以保证该二叉树为平衡二叉树
TreeNode* newNode = new TreeNode(nums[mid]);
//将递归函数返回的节点与当前节点连接,从而形成树
newNode -> left = travel(nums,left,mid - 1);
newNode -> right = travel(nums,mid + 1,right);
//返回当前子树父节点给上一层,最终可以返回平衡二叉树根节点
return newNode;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return travel(nums,0,nums.size() - 1);
}
};
439

被折叠的 条评论
为什么被折叠?



