Contents
1.题目
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
2.解决方案1
struct Node{ TreeNode* t; int l; int r; Node(vector<int> &num, int l, int r){ this->t = new TreeNode(num[l+(r-l)/2]); this->l = l; this->r = r; } Node* getLeft(vector<int> &num){ int m = l + (r-l)/2; if(l>=m) return NULL; Node* left = new Node(num, l, m); t->left = left->t; return left; } Node* getRight(vector<int> &num){ int m = l + (r-l)/2; if(m+1>=r) return NULL; Node* right = new Node(num, m+1, r); t->right = right->t; return right; } }; class Solution { public: TreeNode *sortedArrayToBST(vector<int> &num) { if(num.size()==0) return NULL; stack<Node*> s; Node* root = new Node(num, 0, num.size()); s.push(root); while(!s.empty()){ Node* n = s.top(); s.pop(); Node* left = n->getLeft(num); if(left) s.push(left); Node* right = n->getRight(num); if(right) s.push(right); } return root->t; } };
思路:把一个已经排好序的数组转换成一个平衡二叉搜索树。因为是平衡的二叉搜索树,即左右树的高度只相差1.所以对数组进行二分查找,这样找出的数才好建立树。非递归的方式要用到一个stack作为铺助,把所有的点都处理一次,树就建立好了。
3.解决方案2
class Solution { public: TreeNode* build(vector<int> &num, int left, int right){ if(left <= right){ int mid = (left + right) / 2; TreeNode* rootNode = new TreeNode(num[mid]); rootNode->left = build(num,left,mid - 1); rootNode->right = build(num,mid + 1, right); return rootNode; }else{ return NULL; } } TreeNode *sortedArrayToBST(vector<int> &num) { int len = num.size(); TreeNode * root = NULL; if(len>0) root = build(num, 0, len-1); return root; } };
思路:递归建立树是比较常用的方法,但速度非常慢。
1605