已知树的前序遍历和中序遍历,求后序遍历的方法(转)

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
/*    树中已知先序和中序求后序。
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》      如先序为:abdc,中序为:bdac .
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》      则程序可以求出后序为:dbca 。此种题型也为数据结构常考题型。
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》    算法思想:先序遍历树的规则为中左右,则说明第一个元素必为树的根节点,比如上例
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》中的a就为根节点,由于中序遍历为:左中右,再根据根节点a,我们就可以知道,左子树包含
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》元素为:db,右子树包含元素:c,再把后序进行分解为db和c(根被消去了),然后递归的
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》进行左子树的求解(左子树的中序为:db,后序为:db),递归的进行右子树的求解(即右
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》子树的中序为:c,后序为:c)。如此递归到没有左右子树为止。
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》关于“已知先序和后序求中序”的思考:该问题不可解,因为对于先序和后序不能唯一的确定
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》中序,比如先序为 ab,后序为ba,我只能知道根节点为a,而并不能知道b是左子树还是右子树
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》,由此可见该问题不可解。当然也可以构造符合中序要求的所有序列。
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》2004.12.5
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
*/


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》#include 

<
stdio.h
>

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

int
 find(
char
 c,
char
 A[],
int
 s,
int
 e) 
/* 找出中序中根的位置。 */

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

{
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
int i;
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
for(i=s;i<=e;i++)
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》      
if(A[i]==c) return i;
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

/* 其中pre[]表示先序序,pre_s为先序的起始位置,pre_e为先序的终止位置。 */

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

/* 其中in[]表示中序,in_s为中序的起始位置,in_e为中序的终止位置。 */

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

/* pronum()求出pre[pre_s~pre_e]、in[in_s~in_e]构成的后序序列。 */

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

void
 pronum(
char
 pre[],
int
 pre_s,
int
 pre_e,
char
 
in
[],
int
 in_s,
int
 in_e)
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

{
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char c;
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
int k;
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
if(in_s>in_e)    return ;                 /* 非法子树,完成。 */
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
if(in_s==in_e){printf(%c,in[in_s]); /* 子树子仅为一个节点时直接输出并完成。 */
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》                  
return ;
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》                  }

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》c
=pre[pre_s];                           /* c储存根节点。 */
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》k
=find(c,in,in_s,in_e);                 /* 在中序中找出根节点的位置。 */
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》pronum(pre,pre_s
+1,pre_s+kin_s,in,in_s,k1); /* 递归求解分割的左子树。 */
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》pronum(pre,pre_s
+kin_s+1,pre_e,in,k+1,in_e); /* 递归求解分割的右子树。 */
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》printf(
%c,c);                         /* 根节点输出。 */
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》main()
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

{
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char pre[]=abdc;
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char in[]=bdac;
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》printf(
The result:);
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》pronum(pre,
0,strlen(in)1,in,0,strlen(pre)1);
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》getch();
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}

 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

//
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》..

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》已知二叉树的先序和中序求后序-转贴自CSDN 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》 二叉树的根结点(根据三种遍历)只可能在左右(子树)之间,或这左子树的左边,或右子树的右边。 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》如果已知先序和中序(如果是中序和后序已知也可以,注意:如果是前序和后序的求中序是不可能实现的),先确定这棵二叉树。 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》步骤:

1
,初始化两个数组,存放先序合中序。 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

2
,对比先序和中序,在中序忠查找先序的第一个元素,则在中序遍历中将这个元素的左右各元素分成两部分。即的左边的部分都在这个元素的左子树中,右边的部分都在右子树中。 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

3
,然后从从先序的第二个元素开始继续上面的步骤。 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》如 先序:

1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
10
 
11

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》后序:

3
 
2
 
5
 
4
 
1
 
7
 
9
 
8
 
11
 
10
 
6
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》level 

1

1
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

2

2
 
3
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

3

3
 
4
 
7
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

4

5
 
8
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

5

9
 
10
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

6

11
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》这个太简单了,用个递归就可以,我到是有完整的代码,如下: 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

//
 tree.cpp : Defines the entry point for the console application. 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

//
 

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》#include 


stdafx.h

 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》#include 


string.h

 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》typedef 

struct
 node 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char data; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
struct node *lchild,*rchild; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}

BinNode; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》typedef BinNode 

*
BinTree; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》BinNode 

*
CreateNode(
char
 c) 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》BinNode 
*n1=new BinNode; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》n1
->data=c; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》n1
->lchild=NULL; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》n1
->rchild=NULL; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
return n1; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}

 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

int
 searchchar(
char
 c,
char
 
*
order) 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
for(int i=0;i<strlen(order);i++
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
if(c==order[i]) 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
return i; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
return 1
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}

 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》BinNode

*
 CreateTree(
char
 
*
pre,
char
 
*
in

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char c=pre[0]; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char temppre[100]; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char tempin[100]; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char *p; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
int i=0
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》BinNode
* bnode; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
if(pre==\0
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
return NULL; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》memset(temppre,
0,100); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》memset(tempin,
0,100); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》bnode
=CreateNode(c); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》i
=searchchar(pre[0],in); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
if(i==-1
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
return 0
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》p
=in
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》strncpy(tempin,p,i); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》p
=pre; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》strncpy(temppre,p
+1,i); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》bnode
->lchild=CreateTree(temppre,tempin);//left 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》memset(tempin,
0,100); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》memset(temppre,
0,100); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》p
=in+i+1
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》strncpy(tempin,p,strlen(
in)i); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》p
=pre+i+1
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》strncpy(temppre,p,strlen(
in)i); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》bnode
->rchild=CreateTree(temppre,tempin); //right 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
return bnode; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}

 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

void
 POSTORDER(BinNode 
*
t) 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
if(t) /*二叉树t非空*/ 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》POSTORDER(t
->lchild); /*后序遍历*t的左子树*/ 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》POSTORDER(t
->rchild); /*后序遍历*t的右子树*/ 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》printf(
\t%c,t->data); /*访问结点*/ 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}
 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}

 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》

int
 main(
int
 argc, 
char
*
 argv[]) 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》


《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char preorder[100]; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
char inorder[100]; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》BinNode
* Head; 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
do
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》printf(
请输入前序序列\n); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》scanf(
%s,preorder); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》printf(
请输入中序序序列\n); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》scanf(
%s,inorder); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}
while(strlen(preorder)!=strlen(inorder)); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》Head
=CreateTree(preorder,inorder); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》printf(
后序序列为:); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》POSTORDER(Head); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》printf(
\n); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
// printf(“%ld”,strlen(readin)); 
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》
return 0
《已知树的前序遍历和中序遍历,求后序遍历的方法(转)》}


转载:http://www.cppblog.com/abilitytao/archive/2009/03/17/76887.html

点赞