c语言二叉树的还原,由中序遍历和层次遍历还原二叉树。C语言实现
經(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux io映射,【原创】Linux
- 下一篇: c51语言if语句多条件使用,单片机if