实验五 二叉树的基本操作
- 格式:doc
- 大小:43.00 KB
- 文档页数:4
实验五 还原二叉树
实验目的:
1. 熟练掌握二叉树存储结构。
2. 熟练掌握二叉树的遍历及应用。
实验内容:
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
实验要求:
1. 输入说明:输入第1行给出正整数N(N≤50),为树中结点总数。下面2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
2. 输出说明:输出为一个整数,即该二叉树的高度。
测试用例:
序号 输入 输出 说明
1 9
ABDFGHIEC
FDHGIBEAC 5 一般情况测试
2 15
cdefghi jklmnxyz
cdefghi jklmnxyz 15 完全右斜
3 7
Abcdefg
gfedcbA 7 完全左斜
4 1
a
a 1 边界测试:最小N
5 50 略 边界测试:最大N 50 个随机数据
实验分析:
1. 问题分析
本题需要解决两个子问题。
通过输入给定的先序遍历和中序遍历两个序列构建对应二叉树。由于我们知道先序遍历序列的第1个结点必然是根结点,可以在中序遍历序列中找到这个根结点的位置,于是就知道在中序遍历序列中,根结点左边的所有结点一定属于左子树,右边的所有结点一定属于右子树。根据这个判断,可以从中序遍历序列中知道左、右子树分别有L和R个结点,它们必然对应存储在先序遍历序列中第2~(L+1)个结点以及最后的R个结点。于是可以对左、右子树递归地解决这个问题,直到生成整个二叉树。
求二叉树的高度。如果已经知道左、右子树的高度,那么树的高度就是左、右子树中比较高的那个高度加1。这是一个可以用二叉树后序遍历解决的问题,在遍历过程中,我们将“访问结点”定义为“求左、右子树高度的较大值并加1”。
2. 实现要点
树形结构用教材中介绍的链表结构存储,结点结构体存储该结点的字符以及左右子树的指针。在构建二叉树和求二叉树高度的过程中,须注意递归终止的条件。
实验参考代码:
#include
#include
#define MAXN 50
typedef struct TreeNode *BinTree;
struct TreeNode {
char Data;
BinTree Left;
BinTree Right;
};
BinTree CreateBinTree( char *Pre, char *In, int Len )
{ /* 根据先序遍历序列和中序遍历序列构造二叉树 */
BinTree T;
int i;
if ( !Len ) return NULL; /* 递归终止 */
/* 建立当前根结点 */
T = (BinTree)malloc(sizeof(struct TreeNode));
T->Data = Pre[0];
for (i=0; i if (Pre[0]==In[i]) break; /* 递归生成左右子树 */ T->Left = CreateBinTree(Pre+1, In, i); T->Right = CreateBinTree(Pre+i+1, In+i+1, Len-i-1); return T; } int Height( BinTree T ) { /* 求树的高度 */ int THeight, LHeight, RHeight; if( !T ) /* 递归终止条件 */ THeight=0; else { /* 后序遍历 */ LHeight = Height(T->Left); RHeight = Height(T->Right); THeight = (LHeight>RHeight)? LHeight : RHeight; THeight++; /* 树高为左右树高较大者加1 */ } return THeight; } int main() { int N; char Pre[MAXN+1], In[MAXN+1]; BinTree T = NULL; scanf("%d", &N); scanf("%s\n%s", Pre, In); T = CreateBinTree(Pre, In, N); printf("%d\n", Height(T)); return 0; } 实验思考题: 1. 如果题目改为给定后序和中序遍历序列,该如何修改程序? 2. 如果题目输入的序列不保证正确,如何修改程序识别不匹配的错误?