实验五 二叉树的基本操作

  • 格式: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. 如果题目输入的序列不保证正确,如何修改程序识别不匹配的错误?