108. Convert Sorted Array to Binary Search Tree

来源:互联网 发布:java substring(1) 编辑:程序博客网 时间:2024/06/05 23:56

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.


Example:

Given the sorted array: [-10,-3,0,5,9],One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:      0     / \   -3   9   /   / -10  5
因为BST是有序的,比当前节点小的都放在左子树,比当前节点大的都放在右子树,然后要求是balanced,左右子树的深度不能相差超过1,所以考虑用二分的方法,每次找vector中间的数作为根,然后把左半边的vector作为左子树,继续找中间的数;右半边的vector作为右子树,继续找中间的数。。。依次类推,构建出一棵树。

大体思路是清晰的,但是细节还是有很多问题。

1 使用递归,构建当前子树然后返回根

2 mid = (low + high + 1) / 2, 一定要记得+1,不然到最后的边界会有问题

3 递归函数的参数如何选择,需要用mid - 1代替high, mid+1 代替low,不然会有节点重复的现象

4 什么时候终止递归,这个很重要,每次想的都不是太清楚。这道题是当mid == low时直接把左子树设为NULL,而不继续调用递归函数;当mid == high 时,把右子树设为NULL,而不继续调用递归函数。

用例子 [-10, -3, 0, 5, 9] 做一个状态转移,分析一下边界问题,和终止条件:





















代码如下:

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode* builtTree(vector<int> nums, int low, int high) {        int mid = (high + low + 1) / 2; //remember to +1 or mid will be wrong        TreeNode* root = new TreeNode(nums[mid]);        if (mid == low) root->left = NULL; // terminal condition        else root->left = builtTree(nums, low, mid - 1); // mid - 1 instead of mid or node will repeat        if (mid == high) root->right = NULL; // terminal condition        else root->right = builtTree(nums, mid + 1, high); // mid + 1 same as mid - 1        return root;    }    TreeNode* sortedArrayToBST(vector<int>& nums) {        if (nums.size() == 0) return NULL;        if (nums.size() == 1) {            TreeNode* root = new TreeNode(nums[0]);            return root;        }        return builtTree(nums, 0, nums.size() - 1);    }};


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打印机加墨价格 如何给墨盒加墨水 彩色墨盒加墨 打印机加墨要多少钱 打印机换墨水 802墨盒加墨 墨盒价钱 打印机灌墨 墨盒芯片 自动灌墨机 黑色墨盒 复印机墨水 墨盒灌墨 回墨印章价格 一体机加墨 epson墨盒 如墨 墨盒怎么加墨水 回墨刻章 ip7280墨盒 打印机的墨水 墨妖 墨妖草莓酱 强宠--恶魔兽爱 玄墨妖 姓墨的女孩名字 姓墨的古风唯美名字 姓墨的男孩名字 墨姓 墨子 墨子思想 墨子悠作品 墨子著作 墨子的思想 墨子悠 墨子悲丝 墨子的著作 墨子代表作 墨子铭文 墨子图片 墨子名言 墨子古街