左书-通过有序数组生成平衡搜索二叉树

/**
 * @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;
}
posted @ 2018-08-09 20:45  vectorZ  阅读(74)  评论(0)    收藏  举报