把一個有序整數數組放到二叉樹中

來源:互聯網
上載者:User

對於有序數組,取中間節點作為根節點,將數組分成兩部分,對數組的兩部分遞迴構建左右子樹

#include <stdio.h>#include <stdlib.h>#include <queue>template<typename T>class TreeNode { public:  TreeNode() : left_(NULL), right_(NULL) {}  T value_;  TreeNode* left_;  TreeNode* right_;  bool operator<(const TreeNode& right) {    return value_ < right.value_;  }};template<typename T>void Swap(T& left, T& right) {  T tmp = left;  left = right;  right = tmp;}template<typename T>int Partition(T array[], int begin, int end) {  int i = begin - 1;  T x = array[end];  for (int j = begin; j < end; ++j) {    if (array[j] < x) {      Swap(array[i + 1] , array[j]);      i++;    }  }  Swap(array[i + 1], array[end]);  return i + 1;}template<typename T>void QuickSort(T array[], int begin, int end) {  if (end > begin) {    int position = Partition(array, begin, end);    QuickSort(array, begin, position - 1);    QuickSort(array, position + 1, end);  }}template<typename T>TreeNode<T>* BuildTree(TreeNode<T> array[], int begin, int end) {  if (begin < end) {    int middle = begin + (end - begin + 1) / 2;    array[middle].left_ = BuildTree(array, begin, middle - 1);    array[middle].right_ = BuildTree(array, middle + 1, end);    return array + middle;  } else if(begin == end) {    return array + begin;  } else {    return NULL;  }}template<typename T, typename VisitFun>void PreOrderVisit(TreeNode<T>* current, VisitFun visit_fun) {  if (current) {    visit_fun(current->value_);    PreOrderVisit(current->left_, visit_fun);    PreOrderVisit(current->right_, visit_fun);  }}template<typename T, typename VisitFun>void VisitTree(TreeNode<T>* current, VisitFun visit_fun) {  std::queue<TreeNode<T>*> node_queue;  node_queue.push(current);  while (!node_queue.empty()) {    current = node_queue.front();    visit_fun(current->value_);    node_queue.pop();    if (current->left_) {      node_queue.push(current->left_);    }    if (current->right_) {      node_queue.push(current->right_);    }  }}void PrintInt(int value) {  printf("%d ", value);}int main(int argc, char** argv) {  const int kNodeAmount = 1;  TreeNode<int> tree[kNodeAmount];  for (int i = 0; i < kNodeAmount; ++i) {    tree[i].value_ = rand() % 100;  }  QuickSort(tree, 0, kNodeAmount - 1);  for (int i = 0; i < kNodeAmount; ++i) {    printf("%d ", tree[i].value_);  }  printf("\n");  TreeNode<int>* head = BuildTree(tree, 0, kNodeAmount - 1);  VisitTree(head, PrintInt);  //PreOrderVisit(head, PrintInt);}

注意:構建過程中處理begin == end 和end < begin的情況,否則構建會出錯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.