日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言二叉树的还原,由中序遍历和层次遍历还原二叉树。C语言实现

發(fā)布時(shí)間:2024/1/23 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言二叉树的还原,由中序遍历和层次遍历还原二叉树。C语言实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

經(jīng)測,該代碼已經(jīng)修改正確,只需在void BuildTree(char *level,char *inorder,pBiTree T)這里的最后一個(gè)變量T改為引用即可。還有一個(gè)地方判斷調(diào)用右子樹的地方的判斷條件。

#include聽

#include聽

#include聽

typedef聽struct聽_BiTree

{

聽聽聽聽char聽data;

聽聽聽聽struct聽_BiTree聽*lchild;

聽聽聽聽struct聽_BiTree聽*rchild;

}BiNode,聽*pBiTree;

void聽BuildTree(char聽*level,char聽*inorder,pBiTree聽&T)

{

聽聽聽聽int聽i;

聽聽聽聽int聽len=strlen(level);聽聽//取得層次遍歷長度

聽聽聽聽int聽pos=0;

聽聽聽聽if(len==0)

聽聽聽聽聽聽聽聽return聽;

聽聽聽聽char聽*p=strchr(inorder,level[0]);

聽聽聽聽if(p==NULL)聽聽聽聽聽//如果為空則拋棄第一個(gè),跳到下一個(gè);

聽聽聽聽{

聽聽聽聽聽聽聽聽char聽*L=(char*)malloc(sizeof(char)*len);聽聽聽聽//開辟數(shù)組

聽聽聽聽聽聽聽聽strncpy(L,level+1,len-1);聽聽聽聽聽聽聽//舍棄第一個(gè)

聽聽聽聽聽聽聽聽L[len-1]=0;

聽聽聽聽聽聽聽聽BuildTree(L,inorder,T);聽聽聽聽聽//調(diào)用建樹函數(shù)

聽聽聽聽聽聽聽聽return聽;

聽聽聽聽}

聽聽聽聽pos=p-inorder;聽聽聽聽聽聽//得到中序遍歷左子樹字符串長度

聽聽聽聽T->data=level[0];聽聽聽//為根節(jié)點(diǎn)賦值

聽聽聽聽T->lchild=NULL;

聽聽聽聽T->rchild=NULL;

聽聽聽聽if(pos!=0)聽聽//左子樹的遞歸調(diào)用

聽聽聽聽{

聽聽聽聽聽聽聽聽T->lchild=(pBiTree)malloc(sizeof(BiNode));

聽聽聽聽聽聽聽聽char聽*left_level=(char*)malloc(sizeof(char)*len);

聽聽聽聽聽聽聽聽char聽*left_inor=(char*)malloc(sizeof(char)*(pos));

聽聽聽聽聽聽聽聽strncpy(left_level,level+1,len-1);聽聽//舍去層次遍歷第一個(gè)

聽聽聽聽聽聽聽聽strncpy(left_inor,inorder,pos);聽聽聽聽聽//截取左子樹字符串

聽聽聽聽聽聽聽聽left_level[len-1]=0;

聽聽聽聽聽聽聽聽left_inor[pos]=0;

聽聽聽聽聽聽聽聽BuildTree(left_level,left_inor,T->lchild);

聽聽聽聽}

聽聽聽聽if(pos聽rchild=(pBiTree)malloc(sizeof(BiNode));

聽聽聽聽聽聽聽聽char聽*right_level=(char*)malloc(sizeof(char)*(len));

聽聽聽聽聽聽聽聽char聽*right_inor=(char*)malloc(sizeof(char)*(len-pos));

聽聽聽聽聽聽聽聽strncpy(right_level,level+1,len-1);

聽聽聽聽聽聽聽聽strncpy(right_inor,inorder+pos+1,len-pos-1);

聽聽聽聽聽聽聽聽right_level[len-1]=0;

聽聽聽聽聽聽聽聽right_inor[len-pos-1]=0;

聽聽聽聽聽聽聽聽BuildTree(right_level,right_inor,T->rchild);

聽聽聽聽}

}

void聽priOrder(pBiTree聽T)

{

聽聽聽聽if聽(T聽!=聽NULL){

聽聽聽聽聽聽聽聽printf聽("%c",聽T->data);

聽聽聽聽聽聽聽聽priOrder(T->lchild);

聽聽聽聽聽聽聽聽priOrder(T->rchild);

聽聽聽聽}

}

void聽postOrder(pBiTree聽T)

{

聽聽聽聽if聽(T聽!=聽NULL){

聽聽聽聽聽聽聽聽postOrder(T->lchild);

聽聽聽聽聽聽聽聽postOrder(T->rchild);

聽聽聽聽聽聽聽聽printf聽("%c",聽T->data);

聽聽聽聽}

}

void聽freeNode(pBiTree聽&T)

{

聽聽聽聽if聽(T聽!=聽NULL){

聽聽聽聽聽聽聽聽freeNode(T->lchild);

聽聽聽聽聽聽聽聽freeNode(T->rchild);

聽聽聽聽聽聽聽聽free(T);

聽聽聽聽}

}

int聽main()

{

聽聽聽聽pBiTree聽root;

聽聽聽聽char聽level[28],聽inorder[28];

聽聽聽聽int聽n;

聽聽聽聽scanf聽("%d",聽&n);

聽聽聽聽//fflush(stdin);

聽聽聽聽getchar();

聽聽聽聽while聽(n聽--){

聽聽聽聽聽聽聽聽scanf聽("%s%s",聽level,聽inorder);

聽聽聽聽聽聽聽聽root聽=聽(pBiTree)malloc(sizeof(BiNode));

聽聽聽聽聽聽聽聽BuildTree(level,聽inorder,聽root);

聽聽聽聽聽聽聽聽priOrder(root);

聽聽聽聽聽聽聽聽printf聽("\n");

聽聽聽聽聽聽聽聽postOrder(root);

聽聽聽聽聽聽聽聽printf聽("\n");

聽聽聽聽聽聽聽聽//freeNode(root);

聽聽聽聽}

聽聽聽聽return聽0;

}

總結(jié)

以上是生活随笔為你收集整理的c语言二叉树的还原,由中序遍历和层次遍历还原二叉树。C语言实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。