实验5:二叉树的建立及遍历
(第十三周星期三7、8节)
一 、实验目的
1.学会实现二叉树结点结构和对二叉树的基本操作。
2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
二 、实验要求
1.认真阅读和掌握和本实验相关的教材内容。
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容
1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历并计算出二叉树的高度。
2 .编写程序生成下面所示的二叉树,并采用中序遍历的非递归算法对此二叉树进行遍历。
四、思考与提高
1.如何计算二叉链表存储的二叉树中度数为1的结点数?
2.已知有—棵以二叉链表存储的二叉树,root指向根结点,p指向二叉树中任一结点,如何求从根结点到p所指结点之间的路径?
/*----------------------------------------
* 05-1_递归遍历二叉树.cpp -- 递归遍历二叉树的相关操作
* 对递归遍历二叉树的每个基本操作都用单独的函数来实现
* 水上飘 2009年写
----------------------------------------*/
// ds05.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
typedef char ElemType;
using namespace std;
typedef struct BiTNode {
ElemType data;
//左右孩子指针
BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//动态输入字符按先序创建二叉树
void CreateBiTree(BiTree &T) {
char ch;
ch = ();
if(ch == ' ') {
T = NULL;
}
else {
if(ch == '\n') {
cout << "输入未结束前不要输入回车,"
"要结束分支请输入空格!" << endl;
}
else {
//生成根结点
T = (BiTNode * )malloc(sizeof(BiTNode));
if(!T)
cout << "内存分配失败!" << endl;
T->data = ch;
//构造左子树
CreateBiTree(T->lchild);
//构造右子树
CreateBiTree(T->rchild);
}
}
}
//输出e的值
ElemType PrintElement(ElemType e) {
cout << e << " ";
return e;
}
//先序遍历
void PreOrderTraverse(BiTree T) {
if (T != NULL) {
//打印结点的值
PrintElement(T->data);
//遍历左孩子
PreOrderTraverse(T->lchild);
//遍历右孩子
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T) {
if (T != NULL) {
//遍历左孩子
InOrderTraverse(T->lchild);
//打印结点的值
PrintElement(T->data);
//遍历右孩子
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T) {
if (T != NULL) {
//遍历左孩子
PostOrderTraverse(T->lchild);
//遍历右孩子
PostOrderTraverse(T->rchild);
//打印结点的值
PrintElement(T->data);
}
}
//按任一种遍历次序输出二叉树中的所有结点
void TraverseBiTree(BiTree T, int mark) {
if(mark == 1) {
//先序遍历
PreOrderTraverse(T);
cout << endl;
}
else if(mark == 2) {
//中序遍历
InOrderTraverse(T);
cout << endl;
}
else if(mark == 3) {
//后序遍历
PostOrderTraverse(T);
cout << endl;
}
else cout << "选择遍历结束!" << endl;
}
//输入值并执行选择遍历函数
void ChoiceMark(BiTree T) {
int mark = 1;
cout << "请输入,先序遍历为1,中序为2,后序为3,跳过此操作为0:";
cin >> mark;
if(mark > 0 && mark < 4) {
TraverseBiTree(T, mark);
ChoiceMark(T);
}
else cout << "此操作已跳过!" << endl;
}
//求二叉树的深度
int BiTreeDepth(BiTNode *T) {
if (T == NULL) {
//对于空树,返回0并结束递归
return 0;
}
else {
//计算左子树的深度
int dep1 = BiTreeDepth(T->lchild);
//计算右子树的深度
int dep2 = BiTreeDepth(T->rchild);
//返回树的深度
if(dep1 > dep2)
return dep1 + 1;
else
return dep2 + 1;二叉树中序遍历非递归算法
}
}
int _tmain(int argc, _TCHAR* argv[])
{
BiTNode *bt;
bt = NULL; //将树根指针置空
cout << "输入规则:" << endl
<< "要生成新结点,输入一个字符,"
"不要生成新结点的左孩子,输入一个空格,"
"左右孩子都不要,输入两个空格,"
"要结束,输入多个空格(越多越好),再回车!"
<< endl << "按先序输入:";
CreateBiTree(bt);
cout << "树的深度为:" << BiTreeDepth(bt) << endl;
ChoiceMark(bt);
return 0;
}
/*----------------------------------------
* 05-2_构造二叉树.cpp -- 构造二叉树的相关操作
* 对构造二叉树的每个基本操作都用单独的函数来实现
* 水上飘 2009年写
----------------------------------------*/
// ds05-2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#define STACK_INIT_SIZE 100 //栈的存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef char ElemType; //元素类型
using namespace std;
typedef struct BiTNode {
ElemType data; //结点值
BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode, *BiTree;
typedef struct {
BiTree *base; //在栈构造之前和销毁之后,base的值为空
BiTree *top; //栈顶指针
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论