原題:
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
【複習時間】:平衡二叉樹(Balanced Binary Tree)具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。常用算法有紅黑樹、AVL、Treap、伸展樹等。在平衡二叉搜索樹中,我們可以看到,其高度一般都良好地維持在O(log2n),大大降低了操作的時間複雜度。
參考鏈接:www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html
思路:一開始想的過於複雜了,以爲涉及到了zigzag之類的東西。但其實這道題用遞歸就可以完成。其中有很多需要注意的細節:
1. TreeNode *root=NULL;指針一定要初始化不然一定會runtime error!。
2. buildBST(vector<int> &num, TreeNode *&root, int left, int right) 傳遞樹節點的指針時必須還有個引用符號,即*&,光有*或是光有&都是傳遞不了指針的,主函數最後的返回結果會成爲空。
代碼:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *sortedArrayToBST(vector<int> &num) {
TreeNode *root=NULL;
if(num.size()>0)
buildBST(num, root, 0, num.size()-1);
return root;
}
void buildBST(vector<int> &num, TreeNode *&root, int left, int right){
if(left>right) return;
int mid = (left+right)/2;
root = new TreeNode(num[mid]);
buildBST(num, root->left, left, mid-1);
buildBST(num, root->right, mid+1, right);
}
};