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

原创 2005年05月08日 21:09:00
用二叉树的中序和前序还原二叉树
主要解答者: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  ;  
}  

【LeetCode笔记】Construct Binary Tree from Preorder and Inorder Traversal 前序、中序还原二叉树

思路: 1.这道题还是借鉴了其他大佬的思路,仔细分析一下,前序遍历的第一个值是根节点值(假设为val),那么在中序遍历中val之前的都是根节点的左子树,val值之后的都是右子树。同理递归可还原二叉树...
  • macidoo
  • macidoo
  • 2017年04月11日 21:49
  • 84

数据结构实验之求二叉树后序遍历和层次遍历(根据前序中序还原二叉树)

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述  已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序...

剑指offer_根据前序和中序确定二叉树

/* 重建二叉树: 根据前序和中序确定二叉树 思路: 递归,找到前序的第一个元素在中序中的位置,该位置之前的元素均为左子树,该位置之后的元素均为右子树,递归处理左右子树 */ class TreeNo...

第六章 遍历二叉树及推导遍历结果(前序、中序和后续)

二叉树遍历方法下面几种算法是利用递归的方法实现的 - 前序遍历:先打印输出,再先序遍历左子树,最后先序遍历右子树 - 中序遍历:中序遍历左子树,再打印,最后中序遍历右子树 - 后序遍历:先后序遍...

二叉树前序中序求解树

  • 2014年12月04日 16:18
  • 37KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用二叉树的中序和前序还原二叉树
举报原因:
原因补充:

(最多只允许输入30个字)