Description
已知一棵二叉樹的前序序列和中序序列分別存於兩個一維數組中,試編寫算法建立該二叉樹的二叉鏈表。
Input
分兩行分別輸入一棵二叉樹的前序序列和中序序列。
Output
輸出該二叉樹的後序序列。
- Sample Input
ABDFGCEH BFDGACEH
- Sample Output
FGDBHECA
題解:先序和中序可確定唯一二叉樹,後序和中序可確定唯一二叉樹,先序和後序不可確定唯一二叉樹。#include<stdio.h> #include<stdlib.h> typedef struct BTNode{ char data; struct BTNode *lchild; struct BTNode *rchild; }BTNode; char pre[100], mid[100]; int len; void init(){ int i; char s; for(i = 0; i < 100; i++){ pre[i] = '#'; mid[i] = '#'; } i = 0; while(scanf("%c",&s) && s!='\n'){ pre[i] = s; i++; } i = 0; while(scanf("%c",&s) && s!='\n'){ mid[i] = s; i++; } i = 0; while(pre[i]!='#'){ i++; } len = i; } BTNode *CreateNode(int pre_start, int pre_end, int mid_start, int mid_end){ int i, LLen,RLen; BTNode *root = (BTNode*)malloc(sizeof(BTNode)); root->data = pre[pre_start]; root->lchild = NULL; root->rchild = NULL; i = mid_start; while(root->data != mid[i]) i++; LLen = i - mid_start; RLen = mid_end - i; if(LLen){ root->lchild = CreateNode(pre_start+1, pre_start+LLen, mid_start, i-1); } if(RLen){ root->rchild = CreateNode(pre_start+LLen+1, pre_end, i+1,mid_end); } return root; } void PrintfTree(BTNode *root){ if(root->lchild) PrintfTree(root->lchild); if(root->rchild) PrintfTree(root->rchild); printf("%c",root->data); } int main(){ BTNode *root = (BTNode*)malloc(sizeof(BTNode)); init(); root = CreateNode(0 , len-1, 0, len-1); PrintfTree(root); return 0; }
先序的第一個元素A及根節點,找到該元素對應在中序序列中的A1,A1左邊即爲根節點左子樹上的全部元素,A1右邊即爲根節點右子樹上的全部元素。以此類推,找出所有根節點。