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

转载 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  ;  
}  

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

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

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

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

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

#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
  • 794

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

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

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

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

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

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述  已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序...
  • qq_35354855
  • qq_35354855
  • 2016年08月12日 15:25
  • 1188

为什么只给出前序和后序,不能唯一确定一个二叉树

我们在学习二叉树的遍历时,都会不可避免的学到二叉树的三种遍历方式,分别是遵循(根-左-右)的前序遍历、遵循(左-根-右)的中序遍历以及遵循(左-右-根)的后序遍历。并且每一个二叉树都可以用这三种遍历方...
  • yusiguyuan
  • yusiguyuan
  • 2015年01月13日 22:55
  • 2539

根据前序和中序序列,建立二叉树(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
  • 520

根据前序和中序重建二叉树

注意:1、仅根据前序和后序无法构建唯一的二叉树;2、二叉树前序遍历,第一个数字总是树的根节点的值;3、中序遍历中,根节点的值在序列的中间,左子树的值子在根节点的值得左边,右字树的值在根节点的值得右边;...
  • dutsoft
  • dutsoft
  • 2014年05月21日 15:13
  • 940

根据前序和中序构造二叉树-java版

package offer; class TreeNode{ public int value; public TreeNode left; public TreeNode right; pu...
  • huangcan0532
  • huangcan0532
  • 2015年07月06日 17:09
  • 619
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用二叉树的中序和前序还原二叉树
举报原因:
原因补充:

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