一、实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、 实验内容
1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实现树的构造,并完成:
1)用前序遍历、中序遍历、后序遍历输出结点数据;
2)以合理的格式,输出各个结点和双亲、孩子结点信息;
3)输出所有的叶子结点信息;
2、试设计一个程序,将输入的字符串转化为对应的哈夫曼编码,然后再将这个哈夫曼编码序列进行解码,也就是恢复原来的字符串序列。(*)
//
// DoubleTree.h
// 二叉树链式存储
//
// Created by 梁华建 on 2017/11/9.
// Copyright © 2017年 梁华建. All rights reserved.
//
#include <iostream>
using namespace std;
#ifndef DoubleTree_H
#define DoubleTree_H
struct BINode {
char data;
BINode *lchild, *rchild;
};
class DoubleTree {
public:
DoubleTree() { root = Creat(root); } //构造函数,建立一颗二叉树
~DoubleTree() { Release(root); } //析构函数,释放各结点的存储空间
void PreOrder() { PreOrder(root); } //前序遍历二叉树
void Inorder() { InOrder(root); } //中序遍历
void PostOrder() { PostOrder(root); } //后序遍历二叉树
private:
BINode *root; //指向根结点的头指针
BINode *Creat(BINode *bt); //构造函数调用
void Release(BINode *bt);
void PreOrder(BINode *bt);
void InOrder(BINode *bt);
void PostOrder(BINode *bt);
};
//创建函数,当一个节点连续输入两个##他就变成叶子,会终止这二叉树
BINode *DoubleTree::Creat(BINode *bt) {
char ch;
cout << "请输入创建一颗二叉树结点数据" << endl;
cin >> ch;
if (ch == '#') return NULL;
else {
bt = new BINode; //生成结点
bt->data = ch;
bt->lchild = Creat(bt->lchild);
bt->rchild = Creat(bt->rchild); //递归建立右子树
}
return bt;
}
void DoubleTree::Release(BINode *bt) {
if (bt != NULL) {
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
void DoubleTree::PreOrder(BINode *bt) {
if (bt == NULL) return; //return空:跳出循环,0和1用,0和-1用,int main和return 0用;
else {
cout << bt->data << "";
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void DoubleTree::InOrder(BINode *bt) {
if (bt == NULL) return;
else {
InOrder(bt->lchild);
cout << bt->data << "";
InOrder(bt->rchild);
}
}
void DoubleTree::PostOrder(BINode *bt) {
if (bt == NULL) return;
else {
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout << bt->data << "";
}
}
int main() {
DoubleTree Tree;
cout << "----前序遍历----" << endl;
Tree.PreOrder();
cout << endl;
cout << "----中序遍历----" << endl;
Tree.Inorder();
cout<<endl;
cout << "----后序遍历----" << endl;
Tree.PostOrder();
cout << endl;
return 0;
}
#endif /* DoubleTree_h */
实验总结:
这次链式二叉树比较麻烦,先创建一个结构体(拥有左孩子和右孩子属性),然后嵌套重复调用构造函数递归建立树
连续输入两个##则那个节点就会变成叶子,连续输入四个#则二叉树建立完成,然后进行前序遍历(先根然后左再右),中序遍历(先左然后根后右),后序遍历(先左然后右再根)。