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

转载 2004年07月08日 12:47:00
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  ;  
}  

Java实现一直二叉树前序和中序,还原二叉树

前序:ABCDEF 中序:CBAEDF 求原来的二叉树 前序:根左右 中序:左根右 后序:左右根 根据前序和中序还原二叉树:    思路:根据前序知道二叉树的根包括各个子树的根,然后再在...
  • cherry_chenrui
  • cherry_chenrui
  • 2017-09-06 20:59:50
  • 163

从前序+中序或者后序+中序序列中恢复二叉树过程

给出前序遍历和中序遍历,如何绘制出二叉树: 如果给出遍历产生的一串字符,不容易确定各个字符在树中的具体位置,因而需要两个遍历串相结合才能画出一棵二叉树。 如,给出前序遍历ADFGHKLPQRWZ,...
  • dalong277
  • dalong277
  • 2016-04-26 11:18:14
  • 2054

根据二叉树前序、中序遍历还原二叉树

在学习二叉树遍历的时候我们学习了三种遍历方法 前序 中序 后序 同时我们知道给定前序和中序、中序和后序我们可以还原二叉树, 记得当时只是在纸上画了一画。现在把当时的想法完成。 给定前序和中序还原...
  • w823626691
  • w823626691
  • 2014-04-07 14:02:07
  • 1476

牛客网的题,重建二叉树。(用树的先序,中序,还原二叉树)

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7...
  • wsyxhwj
  • wsyxhwj
  • 2016-05-20 21:49:37
  • 930

根据先序和中序还原(重建)一个二叉树

package tree.BinaryTree;import java.util.Arrays;/** * 根据先序和中序还原一个二叉树 * * @author yuzhiyun * */...
  • yuzhiyun3536
  • yuzhiyun3536
  • 2016-12-05 16:06:03
  • 537

如何根据前序、中序、后序遍历还原二叉树

面试题目或多或少会出现这样的选择题或者简答题: 首先我们得知道概念: 前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树。对于二叉树,深度遍历与此同。规律:根在前;子树在根...
  • yanerhao
  • yanerhao
  • 2015-04-21 20:49:38
  • 6002

数据结构二叉树之通过前序和中序恢复二叉树后续方法输出

#include"stdio.h" #include"stdlib.h" #define max 100 typedef struct node { char data; struct node ...
  • Yiyuan_chen
  • Yiyuan_chen
  • 2016-11-10 00:02:40
  • 879

7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)

7-9 还原二叉树(25 point(s)) 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。 输入格式: 输入首先给出正整数N(≤50),为树中结点总数。下面两...
  • codeswarrior
  • codeswarrior
  • 2017-11-10 21:48:23
  • 274

根据前序和中序序列,建立二叉树(java实现)

根据前序序列:int[] preSort={1,2,4,7,3,5,6,8}; 中序序列:int[] inSort=new int[]{4,7,2,1,5,3,8,6}; 建立二叉树,求后序遍历等问题...
  • A784586
  • A784586
  • 2017-01-09 18:13:19
  • 956

数据结构——根据前序遍历和中序遍历还原二叉树

#include /* 给定了前序遍历和中序遍历,还原一刻二叉树 */ using namespace std; //定义一颗二叉树的节点 struct binaryNode { int...
  • Leo____Wang
  • Leo____Wang
  • 2016-11-08 22:56:38
  • 308
收藏助手
不良信息举报
您举报文章:用二叉树的中序和前序还原二叉树
举报原因:
原因补充:

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