链式二叉树

一、实验目的

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


实验总结:

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

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


### 链式二叉树数据结构 链式二叉树是一种常见的二叉树存储形式,尤其适用于非完全二叉树的情况。在这种结构中,每个节点由三部分组成:数据域用于保存节点的实际数据;两个指针域分别指向该节点的左子节点和右子节点[^1]。 以下是典型的链式二叉树节点定义: ```c typedef struct TreeNode { int data; // 数据域 struct TreeNode* left; // 左孩子指针 struct TreeNode* right; // 右孩子指针 } TreeNode; ``` 这种设计使得链式二叉树能够灵活表示任意形状的二叉树,而不会像顺序存储那样浪费空间。 --- ### 链式二叉树的实现方式 链式二叉树的操作主要依赖递归思想完成。相比顺序存储结构,虽然编写起来更直观,但由于涉及递归调用,初学者可能会觉得复杂[^2]。下面列举几个基本操作及其具体实现方法: #### 创建新节点 创建一个新的二叉树节点是一个基础功能,通过分配内存并初始化其字段来完成。 ```c TreeNode* createNode(int value) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); if (!newNode) return NULL; // 内存不足返回NULL newNode->data = value; newNode->left = newNode->right = NULL; return newNode; } ``` 此函数负责动态分配一块新的 `TreeNode` 类型内存区域,并将其初始化为指定值以及设置左右孩子的初始状态为空[^3]。 #### 插入节点 对于简单的二叉查找树来说,可以根据数值大小决定插入位置。 ```c void insertNode(TreeNode** root, int value) { if (*root == NULL) { *root = createNode(value); } else { if (value < (*root)->data) { insertNode(&((*root)->left), value); // 小于当前节点则进入左子树 } else { insertNode(&((*root)->right), value); // 大于等于则进入右子树 } } } ``` 上述代码展示了如何利用递归来构建一棵基于比较运算符形成的二叉搜索树(BST)。 #### 前序遍历 前序遍历按照访问根节点 -> 访问左子树 -> 访问右子树 的顺序执行。 ```c void preOrderTraversal(TreeNode* node) { if (node != NULL) { printf("%d ", node->data); // 输出当前节点数据 preOrderTraversal(node->left); // 进行左子树先序遍历 preOrderTraversal(node->right); // 进行右子树先序遍历 } } ``` 这段程序体现了递归算法的核心应用之一——处理具有层次关系的对象集合。 --- ### 总结 链式二叉树因其灵活性成为实际开发中最常用的二叉树表现形式之一。掌握它的核心概念不仅有助于理解其他高级数据结构,还能有效提升个人解决问题的能力特别是关于递归方面的技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值