参考:
如先序为:abdc,中序为:bdac .
则程序可以求出后序为:dbca 。此种题型也为数据结构常考题型。
算法思想:先序遍历树的规则为中左右,则说明第一个元素必为树的根节点,比如上例
中的a就为根节点,由于中序遍历为:左中右,再根据根节点a,我们就可以知道,左子树包含
元素为:db,右子树包含元素:c,再把后序进行分解为db和c(根被消去了),然后递归的
进行左子树的求解(左子树的中序为:db,后序为:db),递归的进行右子树的求解(即右
子树的中序为:c,后序为:c)。如此递归到没有左右子树为止。
关于“已知先序和后序求中序”的思考:该问题不可解,因为对于先序和后序不能唯一的确定
中序,比如先序为 ab,后序为ba,我只能知道根节点为a,而并不能知道b是左子树还是右子树,
#include <stdio.h>
typedef struct _Node{
char data;
struct _Node *lchild;
struct _Node *rchild;
} Node;
Node * CreateTree()
{ /* 生成二叉树的普通方法
* 按先序次序输入二叉树中结点的值
* 构造二叉链表表示的二叉树T。输入空格表示空子树。 */
char ch;
scanf("%c",&ch);
Node *T;
if(ch==' ') /* 空 */
return NULL;
else
{
T=(Node *)malloc(sizeof(Node));
if(!T)
exit(0);
T->data=ch; /* 生成根结点 */
T->lchild = CreateTree(); /* 构造左子树 */
T->rchild = CreateTree(); /* 构造右子树 */
}
return T;
}
/* 由先根序列和中根序列生成二叉树
* 递归法。pre 是先跟序列,in是中根序列
* pre_s是先根序列的起始,pre_e是先跟序列的结束
* in_s是中根序列的起始,in_e是中根序列的结束
*/
Node *Convert(char pre[], int pre_s, int pre_e,
char in [], int in_s , int in_e )
{
if(in_s > in_e)return NULL;
int i = in_s;
for(i=in_s;i<in_e&&in[i]!=pre[pre_s];i++);
Node *p = (Node *)malloc(sizeof(Node));
p->data = pre[pre_s];
p->lchild = Convert(pre, pre_s+1, pre_s+i-in_s,
in, in_s,i-1);
p->rchild = Convert(pre, pre_s+i-in_s+1,pre_e,
in, i+1,in_e);
return p;
}
void PreTranverse(Node *head)
{
if(!head)return ;
printf("%c\t",head->data);
PreTranverse(head->lchild);
PreTranverse(head->rchild);
return;
}
void InTranverse(Node *head)
{
if(!head)return ;
PreTranverse(head->lchild);
printf("%c\t",head->data);
PreTranverse(head->rchild);
return;
}
void BackTranverse(Node *head)
{
if(!head)return;
BackTranverse(head->lchild);
BackTranverse(head->rchild);
printf("%c\t",head->data);
return;
}
int main(int argc, char *argv[])
{
char pre[]="abdc";
char in[]="bdac";
Node *head = NULL;
head = Convert(pre,0,strlen(pre)-1,
in ,0,strlen(in)-1);
InTranverse(head);
printf("\n");
getch();
}
由此可见该问题不可解。当然也可以构造符合中序要求的所有序列。
分享到:
相关推荐
其中,二叉树的遍历是理解二叉树的基础之一,常见的遍历方法有先序遍历、中序遍历和后序遍历。 - **先序遍历**:访问顺序为“根—左—右”。 - **中序遍历**:访问顺序为“左—根—右”。 - **后序遍历**:访问顺序...
根据给定文件的信息,本文将围绕“已知先序和中序遍历序列,求后序遍历序列”的核心主题进行展开,详细解析其中涉及的数据结构与算法,并深入理解其在C语言中的实现细节。 ### 数据结构:二叉树 在计算机科学中,*...
数据结构C++二叉链表的先序遍历、中序遍历和后序遍历实现
二叉树已知后序和中序遍历求前序遍历,C++编写已通过编译
这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -> 左子树 -> 右子树 **中序遍历**:左子树 -> 根节点 -> 右子树 **后序遍历**:左子树 -> 右子...
这可以通过已知的先序和中序遍历来构造二叉树,然后再进行后序遍历。 1. 首先,从先序遍历序列中找到根节点,它是序列中的第一个元素。 2. 接着,在中序遍历序列中找到根节点,将序列分为左右两部分,左侧是左子树...
已知中序遍历和后序遍历,求前序遍历。有比较详尽的中文注释。
C语言,数据结构课程,知道中序和后序遍历,画二叉树和写出前序遍历。
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及先序遍历结果,要求输出其后序遍历结果...
总的来说,从先序和中序遍历序列重建二叉树是一个典型的算法问题,它需要理解二叉树的遍历性质并熟练运用递归思想。在C#中,可以通过构建节点和递归调用来解决这个问题,同时注意在可视化方面可能遇到的挑战。在实际...
"二叉树的遍历问题" 通过给定的文件,可以总结出以下几个知识点: 1. 二叉树的定义:一个二叉树是由一组节点组成的数据结构,其中每个节点...在给定的代码中,create函数用于构建二叉树,post函数用于遍历二叉树。
在这里,我们将深入探讨这两个关键的二叉树遍历方法以及它们在构建二叉树中的应用。 **先序遍历(Preorder Traversal)** 先序遍历是一种访问二叉树节点的顺序:首先访问根节点,然后遍历左子树,最后遍历右子树。...
通过理解递归和二叉树遍历的概念,我们可以有效地处理各种二叉树问题。在实际编程中,递归是一种强大的工具,可以简化复杂的问题,但同时需要注意递归深度可能导致的栈溢出问题。在某些情况下,非递归的迭代解决方案...
二叉树已知前序和中序遍历,求后序遍历,C++代码已编译通过,可直接运行
数据结构实验资料二叉树的建立和遍历 本课程实验旨在使学生掌握数据结构的基本原理和编程方法,达到提高学生分析问题和解决问题的能力的目的。实验的环境采用 TURBO C2.0 或 Visual c++6.0 的运行环境。 数据结构...
本节将详细介绍二叉树的操作,包括建立、删除以及三种遍历方式:中序遍历、先序遍历和后序遍历。 1. **二叉树的建立** - **动态建立**:通常在编程中,我们可以通过动态内存分配创建二叉树的节点,然后根据需求...
二叉树是一种特殊的树结构,每个...通过这个项目,可以深入理解二叉树的特性和遍历方法,以及如何根据已知信息构建和验证二叉树。这在实际的编程问题中非常有用,比如在数据结构和算法的面试中,或者在处理树状数据时。
#### 二叉树遍历概述 - **前序遍历**:访问根节点 -> 遍历左子树 -> 遍历右子树。 - **中序遍历**:遍历左子树 -> 访问根节点 -> 遍历右子树。 - **后序遍历**:遍历左子树 -> 遍历右子树 -> 访问根节点。 #### ...