树 已知遍历序列确定二叉树

it2024-10-21  39

//根据遍历序列确定二叉树 typedef struct BTNode { int data; struct BTNode* lChild; struct BTNode* rChild; }BTNode; //已知先序和中序遍历序列确定二叉树 BTNode *CreateBT(char pre[], char in[], int L1, int R1, int L2, int R2) '''pre[],in[]存入确定遍历序列, L1, R1为数组pre[]的操作范围, L2, R2为数组in[]的操作范围''' { if (L1 > R1) return NULL; BTNode *s = (BTNode *)malloc(sizeof(BTNode)); s->lChild = s->rChild = NULL; s->data = pre[L1]; int i; for(i = L2; i <= R2; ++i) { if(in[i] == pre[L1]) break;//找到中序序列的双亲节点位置 } s->lChild = CreateBT(pre, in, L1+1, L1+i-L2, L2, i-1); s->rChild = CreateBT(pre, in, L1+i-L2+1, R1, i+1, R2); } //已知后序和中序遍历序列 BTNode *CreateBT2(char post[], char in[], int L1, int R1, int L2, int R2) { if (L1 > R1) return NULL; BTNode *s = (BTNode *)malloc(sizeof(BTNode)); s->lChild = s->rChild = NULL; s->data = post[R1]; int i; for(i = L2; i <= R2; ++i) { if(in[i] == post[R1]) break;//找到中序序列的双亲节点位置 } s->lChild = CreateBT2(post, in, L1, L1+i-L2-1, L2, i-1); s->rChild = CreateBT2(post, in, L1+i-L2, R1-1, i+1, R2); } //已知层次和中序遍历序列 int search(char arr[], char key, int L, int R) { int idx; for(idx = L; idx <= R; ++idx) { if(arr[idx] = key) return idx; } return -1 } '''层次遍历序列中获取子序列''' void getSubLevel(char subLevel[], char level[], char in[], int n, int L, int R) { int k =0; for(int i = 0; i < n; ++i) { if (search(in, level[i], L, R) != -1) subLevel[k++] = level[i]; } } BTNode *CreateBT3(char level[], char in[], int n, int L, int R) { if (L > R) return NULL; BTNode *s = (BTNode *)malloc(sizeof(BTNode)); s->lChild = s->rChild = NULL; s->data = level[0]; //找到中序序列的双亲节点位置 int i = search(in, level[0], L, R); //将中序序列分成左子序列、右子序列 int LN = i-N; char LLevel[LN]; int NR = R-i; char RLevel[NR]; getSubLevel(LLevel, level, in, n, L, i-1); getSubLevel(RLevel, level, in, n, i+1, R); s->lChild = CreateBT3(LLevel, in, LN, L, i-1); s->rChild = CreateBT3(RLevel, in, NR, i+1, R); return s; } //只知道先序和后序不能确定二叉树

 

最新回复(0)