重建二叉樹

題目:給定二叉樹的先序和中序遍歷,構建這個二叉樹。例如:先序遍歷結果是:abdcef,中序遍歷的結果是:dbaecf,如何構建二叉樹

分析:先序遍歷的結果中的每一個節點,將中序遍歷的結果分爲左右子樹兩部分,遞歸構建二叉樹,就可以完成樹得構建。

程序如下:

#include <stdio.h>
#include <string>
class TreeNode {
 public:
  TreeNode() : left_(NULL), right_(NULL) {}
  TreeNode(char value) : value_(value), left_(NULL), right_(NULL) {}
  char value_;
  TreeNode* left_;
  TreeNode* right_;
};
void BuildTree(const std::string& pre_order, size_t& offset, const std::string& in_order, int start, int end, TreeNode* &parent) {
  if (offset < pre_order.size() && end >= start) {
    parent = new TreeNode(pre_order[offset]);
    char tmp = pre_order[offset];
    offset++;
    int pivot = start;
    while (pivot <= end) {
      if (in_order[pivot] != tmp) {
        pivot++;
      } else {
        break;
      }
    }      
    BuildTree(pre_order, offset, in_order, start, pivot - 1, parent->left_);
    BuildTree(pre_order, offset, in_order, pivot + 1, end, parent->right_);
  } 
}
void PreOrderVisit(TreeNode* current) {
  if (current) {
    printf("%c ", current->value_);
    PreOrderVisit(current->left_);
    PreOrderVisit(current->right_);
  }
}
void InOrderVisit(TreeNode* current) {
  if (current) {
    InOrderVisit(current->left_);
    printf("%c ", current->value_);
    InOrderVisit(current->right_);
  }
}
int main(int argc, char** argv) {
  std::string pre_order = "abdcef";
  std::string in_order = "dbaecf";
  TreeNode* tree;
  size_t offset = 0;
  BuildTree(pre_order, offset, in_order, 0, in_order.size() - 1, tree);
  PreOrderVisit(tree);
  printf("\n");
  InOrderVisit(tree);
}


注意:剛開始將start和end類型設置爲size_t類型,程序執行總是不對,以至於快顛覆了我對遞歸的理解,不過跟蹤調試的過程,更好的理解了遞歸的處理過程。因爲start或end可能取值-1,而size_t是無符號的,導致判斷出錯,這個問題花費了一些時間來檢查,下次一定注意,涉及到遞歸偏移量的問題,儘量使用有符號數,因爲中間的過程可能出現負數。

參考文獻:

編程之美3.9

發佈了82 篇原創文章 · 獲贊 3 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章