已知先序中序求后序的算法:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知先序中序求后序的算法:相关的知识,希望对你有一定的参考价值。

已知一棵二叉树,其先序序列为:ABDEGMNCFH,中序序列为:DBMGNEACHF,请画出这棵二叉树(给出过程),并给出其后序序列。
用语言描述详细步骤,最好有图。
希望快点帮助我。在线等答案。

首先看先序(根左右),说明A是根,再看中序(左根右),说明A之前的(DBMGNE)都是A的左边,A之后的(CHF)都在A的右边。在看先序的BDEGMN 同样是根左右,B就是A的左子节点,再看中序的DBMGNE,同样是左根右,D就是B的左孩子(而且左边也只有这一个)。。。。。。。继续看先序的EGMN,同样是根左右,E就是B的右孩子,在看中序的MGNE,左根右,说明E只有左边,没有右边,继续看先序的GMN,根据根左右,G就是的左孩子,再看中序的MGN,是左根右,说明M是G的左子树,N是G的右字数。。。。。。。。。左边我都给你分析完了,留右边给您练练手? 方法就是这样!!!!至于后序,我相信你可以写出来的!!!

~~~~~~~~~~~~~~~~~~~分割线~~~~~~~

楼上的分析方法很形象!!!!建议楼主学会那种方法。。。。。
参考技术A 线索二叉树算法

#include <stdio.h>
#include <malloc.h>
#include<stdlib.h>
typedef char DataType;/*定义DataType类型*/
typedef enum PointerTag;
typedef struct node
DataType data;
struct node *lchild, *rchild;/*左右孩子子树*/
PointerTag LTag,RTag;
BiThrNode; /*结点类型*/
typedef BiThrNode *BiThrTree ;/*二叉树类型*/
void CreatBinTree(BiThrTree *T)
/*构造二叉链表,注意:输入序列是先序序列*/
char ch;
if ((ch=getchar())==' ')
*T=NULL;
else /*读入非空格*/
*T=(BiThrNode *)malloc(sizeof(BiThrNode));/*生成结点*/
(*T)->data=ch;(*T)->LTag=Link;(*T)->RTag=Link;
CreatBinTree(&(*T)->lchild); /*构造左子树 */
CreatBinTree(&(*T)->rchild); /*构造右子树*/


BiThrTree pre;/*全局变量*/
void InThreading(BiThrTree p)

if(p)
InThreading(p->lchild);/*左子树线索化*/
if(!p->lchild)/*前驱线索*/
if(!pre->rchild)/*后继线索*/
pre=p;/*保持pre指向p*/
InThreading(p->rchild);/*右子树线索化*/


int InOrderThreading(BiThrTree *Thrt,BiThrTree T)
/*中序遍厉二叉树T,并将其中序线索化,Thrt指向头结点*/
if(!(*Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(0);
(*Thrt)->LTag=Link;(*Thrt)->RTag=Thread;/*建头结点*/
(*Thrt)->rchild=*Thrt;/*右指针回指*/
if(!T) (*Thrt)->lchild=*Thrt;
else
(*Thrt)->lchild=T;pre=*Thrt;
InThreading(T);/*中序遍历进行中序线索化*/
pre->rchild=*Thrt;pre->RTag=Thread;/*最后一个结点线索化*/
(*Thrt)->rchild=pre;

return 1;

int print(BiThrTree e)

int InOrderTraverse(BiThrTree T,int (* visit)(BiThrTree e))
/*T指向头结点,头结点的左链lchild指向根结点,中序遍厉二叉树*/
BiThrTree p;
p=T->lchild;/*p指向根结点*/
while(p!=T)/*空树或遍厉结束时,p==T*/
while(p->LTag==Link) p=p->lchild;
if(!visit(p)) return 0;/*打印*/
while(p->RTag==Thread&&p->rchild!=T)
/*访问后继结点*/
p=p->rchild;

return 1;

void main()
/*测试程序*/
BiThrTree T,Thrt;
CreatBinTree(&T);
InOrderThreading(&Thrt,T);
InOrderTraverse(Thrt,print);

/*可输入"-+a *b -c d /e f "来测试(注意空格)*/
参考技术B 其先序序列为:(A)BDEGMNCFH
中序序列为:DBMGNE(A)CHF
A(BDEGMN)(CFH)
A(B(DEGMN))(CFH)
A(B(D(EGMN)))(CFH)
A(B(D(E(GMN))))(C((FH)))
=>A(B(D(E(G(M)(N)))))(C((F(H))))
A
/ \
B C
/ \ \
D E F
/ /
G H
/ \
M N

后序序列:DMNGEBHFCA本回答被提问者和网友采纳
参考技术C 后序序列为DMNGEBHFCA

数据结构——已知先序中序求后序,已知中序后序求先序

  总结下二叉树的已知两种遍历方式求第三种遍历顺序的方法,已知先序和中序遍历或者后序与中序遍历后二叉树是唯一确定的,下面介绍怎么求出第三种遍历顺序。

  先序遍历顺序为:根结点——左子结点——右子结点,中序遍历为:左子结点——根结点——右子结点,我们注意到,先序遍历的第一个元素就是二叉树根结点,我们在中序遍历中以该元素分为左右两部分,则左边为左子树,右边为右子树,递归即可还原二叉树,这个过程中可直接输出后序遍历的顺序。同理,可以用后序与中序还原出先序遍历的顺序。

代码及测试数据如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <malloc.h>
 6 #include <string>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 
13 #define FRER() freopen("in.txt", "r", stdin);
14 
15 using namespace std;
16 
17 //函数状态码定义
18 #define TRUE        1
19 #define FALSE       0
20 #define OK          1
21 #define ERROR       0
22 #define INFEASIBLE -1
23 #define OVERFLOW   -2
24 
25 typedef char TElemType;
26 typedef int Status;
27 
28 typedef struct BiNode {
29     TElemType data;
30     struct BiNode *lchild, *rchild;
31 }BiNode, *BiTree;
32 
33 BiTree BinaryTreeFormorderings(char *, char *, int);
34 BiTree BinaryTreePostorderings(char *, char *, int);
35 
36 /*
37 ABDECFG
38 DBEAFCG
39 DEBFGCA
40 */
41 
42 int main()
43 {
44     FRER()
45     int n;
46     char str[100], ptr[100];
47     cin >> n >> str >> ptr;
48     BinaryTreePostorderings(str, ptr, n);
49     return 0;
50 }
51 
52 BiTree BinaryTreeFormorderings(char *pre, char *in, int len) {
53     if(len <= 0)
54         return NULL;
55     BiNode *node = new BiNode;
56     node->data = *pre;
57     int idx = 0;
58     while(idx < len) {
59         if(*(in + idx) == *pre)
60             break;
61         ++idx;
62     }
63     node->lchild = BinaryTreeFormorderings(pre + 1, in, idx);
64     node->rchild = BinaryTreeFormorderings(pre + idx + 1, in + idx + 1, len - (idx + 1));
65     cout << node->data <<  ;
66     return node;
67 }
68 
69 BiTree BinaryTreePostorderings(char *in, char *post, int len) {
70     if(len == 0)
71         return NULL;
72     BiNode *node = new BiNode;
73     node->data = *(post + len - 1);
74     cout << node->data <<  ;
75     int idx = 0;
76     while(idx < len) {
77         if(*(in + idx) == *(post + len - 1))
78             break;
79         ++idx;
80     }
81     node->lchild = BinaryTreePostorderings(in, post, idx);
82     node->rchild = BinaryTreePostorderings(in + idx + 1, post + idx, len - (idx + 1));
83     return node;
84 }

 

以上是关于已知先序中序求后序的算法:的主要内容,如果未能解决你的问题,请参考以下文章

数据结构——已知先序中序求后序,已知中序后序求先序

已知先序和中序 求后序

二叉树--已知先序中序求后序--已知中序后序求先序(基本按照网上某大神思路搬过来的)

已知前序中序求后序-二叉树

已知前序和中序求后序,已知中序和后序求先序。

HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)