南陽OJ-756 重建二叉樹(二叉樹的中序遍歷和後序遍歷求先序遍歷)

重建二叉樹

時間限制: 1000 ms  |  內存限制:65535 KB
難度: 3
 
描述
題目很簡單,給你一棵二叉樹的後序和中序序列,求出它的前序序列(So easy!)。
 
輸入
輸入有多組數據(少於100組),以文件結尾結束。
每組數據僅一行,包括兩個字符串,中間用空格隔開,分別表示二叉樹的後序和中序序列(字符串長度小於26,輸入數據保證合法)。
輸出
每組輸出數據單獨佔一行,輸出對應得先序序列。
樣例輸入
ACBFGED ABCDEFG
CDAB CBAD
樣例輸出
DBACEGF
BCAD
二叉樹遞歸遍歷
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點*/
struct node {
  char value;
  node *lchild, *rchild;
};
node *newnode(char c) {//建立新的結點 
  node *p = (node*)malloc(sizeof(node));
  (*p).value = c;
  (*p).lchild = (*p).rchild = NULL;
}
node *rebuild(char* post, char* in, int n) {//由後序遍歷和中序遍歷重建二叉樹 
  if (n == 0) return NULL;
  char ch = post[n-1];//後序遍歷最後一個結點即爲根結點
  node *p = newnode(ch);//建立子樹的根節點 
  int i = 0;
  while (i < n && in[i] != ch) i++;//根據中序遍歷獲得左子樹與右子樹的分界
  int l_len = i;
  int r_len = n-i-1;
  if (l_len > 0) (*p).lchild = rebuild(post, in, l_len);//遞歸遍歷左子樹 
  if (r_len > 0) (*p).rchild = rebuild(post+l_len, in+l_len+1, r_len);//遞歸遍歷右子樹 
  return p;
}
void preorder(node *p) {//先序遍歷二叉樹 ,打印各個結點的權值 
  if (p == NULL) return;
  printf("%c", (*p).value);
  preorder((*p).lchild);
  preorder((*p).rchild);
}
int main() {
  char in[30], post[30];
  while (scanf("%s%s", post, in) != EOF) {
    node *root = rebuild(post, in, strlen(post));
    preorder(root);
    printf("\n");
  }
} 
相關文章
相關標籤/搜索