/**
* @brief 通过有序数组生成平衡搜索二叉树
* @来源: 左程云书籍
* @file sortedArraytoTree.cpp
* @author VectorZ
* @date 2018-08-09
*/
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
typedef struct BinNode {
int val;
BinNode *left;
BinNode *right;
BinNode(int v) : val(v), left(NULL), right(NULL){};
} BinNode, *pBinNode;
/**
* @brief 递归生成平衡二叉搜索树
*
* @param arr
* @param start
* @param end
* @return pBinNode
*/
pBinNode generate(vector<int> arr, int start, int end) {
if (start > end) {
return NULL;
}
int mid = start + ((end - start) >> 1);
pBinNode head = new BinNode(arr[mid]);
head->left = generate(arr, start, mid - 1);
head->right = generate(arr, mid + 1, end);
return head;
}
/**
* @brief 生成树入口,传入排好序的数组
*
* @param arr
* @return pBinNode
*/
pBinNode generateTree(vector<int> arr) {
if (arr.empty()) {
return NULL;
}
return generate(arr, 0, arr.size() - 1);
}
int main() {
vector<int> arr = {1, 2, 3, 4, 5, 6, 7};
pBinNode head = generateTree(arr);
// level visit
queue<pBinNode> bTree;
bTree.push(head);
pBinNode cur = NULL;
while (!bTree.empty()) {
cur = bTree.front();
bTree.pop();
printf("%d ", cur->val);
if (cur->left != NULL) {
bTree.push(cur->left);
}
if (cur->right != NULL) {
bTree.push(cur->right);
}
}
return 0;
}