链式二叉树

来源:互联网 发布:摩托吧app软件 编辑:程序博客网 时间:2024/06/09 22:33

一、实验目的

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 */


实验总结:

这次链式二叉树比较麻烦,先创建一个结构体(拥有左孩子和右孩子属性),然后嵌套重复调用构造函数递归建立树

连续输入两个##则那个节点就会变成叶子,连续输入四个#则二叉树建立完成,然后进行前序遍历(先根然后左再右),中序遍历(先左然后根后右),后序遍历(先左然后右再根)。