1. 程式人生 > >[二叉樹] △ 6.65 已經前序序列、中序序列 建立 二叉樹(二叉連結串列)

[二叉樹] △ 6.65 已經前序序列、中序序列 建立 二叉樹(二叉連結串列)

題目來源:嚴蔚敏《資料結構》C語言版本習題冊 6.65

【題目】6.65 已知一棵二叉樹的前序序列和中序序列分別存於兩個一維陣列中,試編寫演算法建立該二叉樹的二叉連結串列。

【答案】

// 6.65 前序序列、中序序列-->二叉連結串列
BiTNode* PreInOrderToBiTree(char *prestr, char *instr, int prestart, int preend, int instart, int inend) {
	char e;
	int root,leftlen,rightlen;
	BiTNode *p;
	
	e=prestr[prestart]
; p = (BiTNode *)malloc(sizeof(BiTNode)); if (!p) exit(OVERFLOW); p->data=e;p->lchild=NULL;p->rchild=NULL; //找到e在中序中所在的位置 for (root=instart; instr[root]!=e && root<=inend; root++); if (root>inend) return NULL; //出錯 //構建左子樹 leftlen = root - instart; //左子樹長度 if (leftlen) p->
lchild = PreInOrderToBiTree(prestr, instr, prestart+1, prestart+leftlen, instart, instart+leftlen-1); //構建右子樹 rightlen = inend - root; //右子樹長度 if (rightlen) p->rchild = PreInOrderToBiTree(prestr, instr, preend-rightlen+1, preend, inend-rightlen+1, inend); return p; }

【完整程式碼】

/*
@Desc:二叉連結串列 無頭結點
@Vesrion:0.0.1
@Time:20180922建立
*/
#include<stdio.h> #include<stdlib.h> #include<string.h> #ifndef BASE #define BASE #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int bool; #endif #define TElemType char //固定為char,若修改需要修改方法 typedef struct BiTNode { // 結點結構 TElemType data; struct BiTNode *lchild, *rchild; // 左右孩子指標 }BiTNode, *BiTree; void visit(TElemType e) { printf("%c", e); } #define SElemType BiTNode* #include"SqStack.h" #define maxSize 50 //本檔案中 佇列、棧 最大的內容 // 遞迴遍歷 void PreOrder(BiTree T); // 先序遍歷二叉樹 void InOrder(BiTree T); // 中序遍歷二叉樹 void PostOrder(BiTree T); // 後序遍歷二叉樹 // 6.65 前序序列、中序序列-->二叉連結串列 BiTNode* PreInOrderToBiTree(char *prestr, char *instr, int prestart, int preend, int instart, int inend) { char e; int root,leftlen,rightlen; BiTNode *p; e=prestr[prestart]; p = (BiTNode *)malloc(sizeof(BiTNode)); if (!p) exit(OVERFLOW); p->data=e;p->lchild=NULL;p->rchild=NULL; //找到e在中序中所在的位置 for (root=instart; instr[root]!=e && root<=inend; root++); if (root>inend) return NULL; //出錯 //構建左子樹 leftlen = root - instart; //左子樹長度 if (leftlen) p->lchild = PreInOrderToBiTree(prestr, instr, prestart+1, prestart+leftlen, instart, instart+leftlen-1); //構建右子樹 rightlen = inend - root; //右子樹長度 if (rightlen) p->rchild = PreInOrderToBiTree(prestr, instr, preend-rightlen+1, preend, inend-rightlen+1, inend); return p; } int main() { /* 6.65 ABCDEFHIJ CBEFDAHJI */ char prestr[maxSize],instr[maxSize]; BiTree T; scanf("%s", prestr); scanf("%s", instr); T = PreInOrderToBiTree(prestr, instr, 0, strlen(prestr)-1, 0, strlen(instr)-1 ); printf("二叉連結串列:\n"); PreOrder(T);printf("\n"); InOrder(T);printf("\n"); PostOrder(T);printf("\n"); return 0; } // 先序遍歷二叉樹 void PreOrder(BiTree T) { // - 遞迴 if (!T) return ; visit(T->data); PreOrder(T->lchild); PreOrder(T->rchild); } // 中序遍歷二叉樹 void InOrder(BiTree T) { // - 遞迴 if (!T) return ; InOrder(T->lchild); visit(T->data); InOrder(T->rchild); } // 後序遍歷二叉樹 void PostOrder(BiTree T) { // - 遞迴 if (!T) return ; PostOrder(T->lchild); PostOrder(T->rchild); visit(T->data); }