先序和中序構(gòu)造二叉樹(C語言描述)

1.問題描述:

? ? 1 .由已經(jīng)給出的二叉樹的先序(后序)和中序遍歷的結(jié)果構(gòu)造二叉樹。遍歷的結(jié)果以數(shù)組的方 ? 式輸入。

? ? ?2.給定任意一棵二叉樹,使用隊列作為輔助儲存,按樹的結(jié)點(diǎn)的深度,從根開始依次訪問所有結(jié)點(diǎn).

設(shè)計用例:


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 先序:abdecfg ? ? ? ? ? ? ? ? ? ? ? ? ? 中序:dbeafcg

設(shè)計代碼:

#defineLEN20

typedefcharElementtype;

typedefstructTreeNode*T;

typedefstructTreeNode*Position;

typedefstructQueueRecord*Queue;

structTreeNode

{

Elementtypedata;

Positionlchild;

Positionrchild;

};

structQueueRecord

{

intCapacity;

intFront;

intRear;

intSize;

PositionnodeArr[LEN];

};



intmain() {

voidinput (char*preArr,char*midArr);

voidbuildTree(Tt,char*preArr,char*midArr,intlength);

PositioncreateNode();

voidinitQueue(QueueQ);

voidoutputQueue(QueueQ);

charpreArr[LEN],midArr[LEN];

Ttree = createNode();

Queuequeue = (Queue)malloc(sizeof(structQueueRecord));

voidtree_to_queue(Tt,QueueQ);

input(preArr, midArr);

buildTree(tree, preArr, midArr,strlen(preArr));

initQueue(queue);

tree_to_queue(tree,queue);

outputQueue(queue);

getchar(); getchar();

return;

}




voidinput(charpreArr[],charmidArr[]) {

scanf_s("%s",preArr);

scanf_s("%s",midArr);

}




voidbuildTree(Tt,char*preArr,char*midArr,intlength)//t需要有明確的指向

{

intindexOf(char*arr,charx);

PositioncreateNode();

if(0 == strlen(preArr) || 0 == strlen(midArr))

{

t=NULL;

return;

}

Ttree =t;

tree->data =preArr[0];

intindex =

indexOf(midArr,preArr[0]);

intl_length =index;

intr_length =length- 1 - index;

if(l_length >0)

{

tree->lchild = createNode();

buildTree(tree->lchild,preArr+ 1,midArr, l_length);//midArr只是用了一部分;

}

else{

tree->lchild =NULL;

}

tree =t;

if(r_length >0)

{

tree->rchild = createNode();

buildTree(tree->rchild,preArr+ l_length+1,midArr+ 1 + l_length, r_length);

}

else{

tree->rchild =NULL;

}

tree =t;

}

voidpre_travel(Tt)

{

if(t==NULL) {

return;

}

else{

printf("%c",t->data);

pre_travel(t->lchild);

pre_travel(t->rchild);

}

}

voidmid_travel(Tt) {

if(t==NULL) {

return;

}

else{

mid_travel(t->lchild);

printf("%c",t->data);

mid_travel(t->rchild);

}

}

voidtree_to_queue(Tt,QueueQ)

{

intenterQueue(QueueQ,Positionp);

intl_index,r_index;

l_index = 1;

r_index = 1;

intf=enterQueue(Q,t);

while(l_index <=r_index)

{

if(enterQueue(Q, (Q->nodeArr[l_index])->lchild))

{

r_index++;

}

if(enterQueue(Q, (Q->nodeArr[l_index])->rchild))

{

r_index++;

}

l_index++;

}

}

PositioncreateNode()

{

return(Position)malloc(sizeof(structTreeNode));

}

intindexOf(char*arr,charx)

{

intindex = -1;

for(inti = 0; i < strlen(arr); i++)

{

if(x==arr[i])

{

index = i;

break;

}

}

returnindex;

}

voidinitQueue(QueueQ) {

Q->Capacity =50;

Q->Size = 0;

Q->Front = 1;

Q->Rear = 0;//從索引1開始存儲

}

intenterQueue(QueueQ,Positionp)

{

if(NULL==p) {

return0;

}

else{

Q->Size++;

Q->Rear++;

Q->nodeArr[Q->Rear] =p;

return1;

}

}

voidoutputQueue(QueueQ)

{

for(inti = 1; i <=Q->Size; i++)

{

printf("%c", (Q->nodeArr[i])->data);

}

}

樹的結(jié)構(gòu):

隊列結(jié)構(gòu):



? ? ? ?小節(jié):有先序(后序)+中序,但是先序+后序不能確定一棵樹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,890評論 0 33
  • 計算機(jī)二級C語言上機(jī)題庫(南開版) 1.m個人的成績存放在score數(shù)組中,請編寫函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,604評論 1 42
  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,980評論 0 3
  • 1. 數(shù)據(jù)結(jié)構(gòu)和算法 1.1 分解記錄 1.2 找到最大或最小的N個元素 這里可以接受一個參數(shù)key。 1.3 實(shí)...
    plutoese閱讀 1,207評論 0 47
  • 有風(fēng)吹過。 他在風(fēng)中上下翻飛,像紙鳶一樣。 他聽見小孩子的聲音。 “我們?nèi)シ偶堷S吧?!?“好啊,那我放,你可要把線...
    余霜仁閱讀 489評論 0 3

友情鏈接更多精彩內(nèi)容