用二叉树的中序和前序还原二叉树

Q :用二叉树的中序和前序还原二叉树
主要解答者:Betta提交人:langhaixin
感谢:totobi、leemars、Betta
审核者:starfish社区对应贴子:查看
     A :

假设二叉树T的结点值是字符,已知T中结点的前序和中序  
试编写一个把树T按标准形式进行存储的C函数。  
 
二叉树的标准存储形式为  
tpyedef  struct  bt  
{  
         char  data;  
         struct  bt  *lefttree;  
         struct  bt  *righttree;  
}  BinaryTree  
---------------------------------------------------------------  
 
BrinaryTree  *Q[maxsize];  
BrinaryTree  *CREATREE()  
{char  ch;  
 int  fornt,rear;  
 BrinaryTree  *root,*s;  
root=NULL;  
front=1;rear=0;  
ch=getchar();  
while(ch!='#')  
{s=NULL;  
   if(ch!='@')  
     {  
       s=malloc(sizeof(BinaryTree));  
       s->data=ch;  
       s->lefttree=Null;  
       s->righttree=Null;  
       }  
rear++;  
Q[rear]=s;  
if(rear==1)  root=s;  
else  
{if(s&&  Q[front])  
   if  (rear%2==0)  Q[front]->lefttree=s;  
   else    
       Q[front]->righttree=s;  
   if(rear%2==1)  front++;  
}  
ch=getchar;  
}  
return  root;  
}  
---------------------------------------------------------------  
 
我举个例子吧  
 
已知前序是ABCDEFG  中序是CBEDAFG  求二叉树  
 
首先从取前序第1个字母(A)  按此字母把中序分成两段  (CBED)  (AFG)  
A做根  (CBED)做左子树  (FG)右子树  
再按长度把前序后面的部分分成(BCDE)  (FG)  
 
问题就转换成  
已知前序是BCDE  中序是CBED  求二叉树  
和  
已经前序是FG  中序是FG  求二叉树  
 
看出来了没有,递归求解的.  
下面的步骤省略分析.  
前序  中序  :  根  左子树分解  右子树分解  
BCDE  CBED  :  B      (C)  (C)        (ED)  (DE)  
C        C        :  C  
DE   ED      :  D      (E)  (E)  
E        E        :  E  
 
FG      FG      :  F                            (G)  (G)  
G        G        :  G  
得出的二叉树就是  
         A  
       /  /  
     B      F  
   /  /      /  
 C      D      G  
       /  
     E  
 
---------------------------------------------------------------  
 
这个是按  LeeMaRS(小菜虎)  的算法描述写的程序:  
编译:  
//VC  
   cl  -GX  treep.cpp  
//gcc  
   g++  -o  treep  treep.cpp  
 
#include  <iostream>  
 
class  CTreeNode  
{  
public:              
           CTreeNode(char  cVal,  CTreeNode  *  pLeft=0,  CTreeNode  *  pRight=0)  
           :  m_cVal(cVal)  
           ,  m_pLeft(pLeft)  
           ,  m_pRight(pRight)  
           {  
           }  
           ~CTreeNode()  
           {  
                       if(m_pLeft  !=  0)  
                       {  
                                   delete  m_pLeft  ;  
                       }  
                       std::cout  <<  m_cVal  ;  
                       if(m_pRight  !=  0)  
                       {  
                                   delete  m_pRight  ;  
                       }  
           }  
           char  m_cVal  ;  
           CTreeNode  *  m_pLeft  ;  
           CTreeNode  *  m_pRight  ;  
}  ;  
 
 
CTreeNode  *  CreateNode(char  *  sPre,  char  *  sMid,  int  nSize)  
{  
           if(nSize  ==  0)  
                       return  0  ;  
           if(nSize  ==  1)  
                       return  new  CTreeNode(*sPre)  ;  
           int  nSplitMid  ;  
           for(nSplitMid=0;  nSplitMid<nSize;  ++nSplitMid)  
           {  
                       if(sMid[nSplitMid]  ==  sPre[0])  
                                   break  ;  
           }  
           if(nSplitMid  ==  nSize)  
                       return  0  ;  
           return  new  CTreeNode(*sPre,  CreateNode(sPre+1,  sMid,  nSplitMid),  
                       CreateNode(sPre+nSplitMid+1,  sMid+nSplitMid+1,  nSize-nSplitMid-1))  ;  
}  
 
int  main()  
{  
           CTreeNode  *  p  =  CreateNode("ABCDEFG",  "CBEDAFG",  7)  ;  
           if(p  !=  0)  
                       delete  p  ;  
           std::cout  <<  std::endl  ;  
           return  0  ;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值