【数据存储】二叉树的链式存储

二叉链表

数组表示法用于完全二叉树的存储表示非常有效,但表示一般二叉树则不是很理想。此外,在一棵树中进行插入和删除操作时,为了反应结点层次的变动,可能需要移动许多的结点,这样降低了算法的效率,而使用了链表表示可以克服这样的缺点。
根据二叉树的定义,可以设计出二叉树节点的构造。二叉树的每一个结点至少应该包括三个域:数据、左孩子、右孩子。这种链表结构一般被叫做二叉链表。使用这种链表可以很方便的表示和找到它的子女,但找到它的双亲却很困难。为了便于查找双亲,我们还可以增加一个双亲指针域,这种结构被称为三叉链表。
结构如下:
这里写图片描述

二叉链表的类定义

三叉链表和二叉链表类似,本文只讨论二叉链表。下面给出二叉链表的类定义。

#ifndef _HEAD_
#define _HEAD_

#include <iostream>
typedef int  DataType;
typedef struct BinTreeNode
{
    DataType data;
    BinTreeNode *leftchild, *righutchild;
}Binarynode;

class BinaryTree
{
public:
    BinaryTree()
        :root(NULL){}
    BinaryTree(BinaryTree& s);
    ~BinaryTree();
    void creatBinTree(Binarynode*&subTree);
    void ceratBinTree();
    bool IsEmpty()
    {
        return root == NULL ? 1 : 0;
    }
    Binarynode *find();//搜索
    void PreOrder();
    void PreOrder(Binarynode *subTree);//前序遍历
    void InOrder();
    void InOrder(Binarynode *subTree);//中序
    void PostOrder();
    void PostOrder(Binarynode *subTree);//后序
    int count(Binarynode* subTree);//统计节点个数
    int count();
    int Hight();
    int Hight(Binarynode* subTree);//求树高度
    void copy();
    BinaryTree* copy(Binarynode*&Tree);//复制二叉树
private:
    Binarynode *root;
};

#endif

二叉链表的实现

#include <iostream>
using namespace std;
typedef char  DataType;
DataType RefValue = '#';//输入结束符
typedef struct BinTreeNode
{
    DataType data;
    BinTreeNode *leftchild, *rightchild;
}Binarynode;

class BinaryTree
{
public:
    BinaryTree()
        :root(NULL){}
    BinaryTree(BinaryTree& s);
    ~BinaryTree();
    bool IsEmpty();
    Binarynode *find(DataType &item);//搜索
    void creatBinTree();
    void creatBinTree(Binarynode*&subTree);
    void PreOrder();
    void PreOrder(Binarynode *subTree);//前序遍历
    void InOrder();
    void InOrder(Binarynode *subTree);//中序
    void PostOrder();
    void PostOrder(Binarynode *subTree);//后序
    int count(Binarynode* subTree);//统计节点个数
    int count();
    int Hight();
    int Hight(Binarynode* subTree);//求树高度
    void copy();
    Binarynode* copy(Binarynode*&Tree);//复制二叉树
    void destory(Binarynode*&Tree);//销毁
private:
    Binarynode *root;
};
bool BinaryTree::IsEmpty()
{
    return root == NULL ? 1 : 0;
}
Binarynode* BinaryTree::find(DataType& item)
{
    if (item != NULL)
    {
        Binarynode *tmp = root;
        Binarynode*tmpl = tmp->leftchild;
        Binarynode*tmpr = tmp->rightchild;
        DataType temp = root->data;
        while (tmpl)
        {
            if (temp != item)
            {
                tmpl = tmpl->leftchild;
            }
            cout << "i find it";
            return tmpl;
        }
        while (tmpr)
        {
            if (temp != item)
            {
                tmpr = tmpr->rightchild;
            }
            cout << "i find it ";
            return tmpr;
        }


    }
    cout << "can't find it";
    return  NULL;
}
void BinaryTree::PreOrder()
{
    PreOrder(root);
}
void BinaryTree::PreOrder(Binarynode*subTree)
{
    if (subTree != NULL)
    {
        cout << subTree->data;
        PreOrder(subTree->leftchild);
        PreOrder(subTree->rightchild);
    }
}
void BinaryTree::InOrder()
{
    InOrder(root);
}
void BinaryTree::InOrder(Binarynode* subTree)
{
    if (subTree != NULL)
    {
        InOrder(subTree->leftchild);
        cout << subTree->data;
        InOrder(subTree->rightchild);
    }
}void BinaryTree::PostOrder()
{
    PostOrder(root);
}
void BinaryTree::PostOrder(Binarynode*subTree)
{
    if (subTree != NULL)
    {
        PostOrder(subTree->leftchild);
        PostOrder(subTree->rightchild);
        cout << subTree->data;
    }
}
int BinaryTree::Hight()
{
    return Hight(root);
}
int BinaryTree::Hight(Binarynode* subTree)
{
    if (subTree == NULL)
    {
        return 0;
    }
    else
    {
        int dep1 = Hight(subTree->leftchild);
        int dep2 = Hight(subTree->rightchild);
        if (dep1>dep2)
        {
            return dep1 + 1;
        }
        else
        {
            return dep2 + 1;
        }
    }
}
int BinaryTree::count()
{
    return count(root);
}
int BinaryTree::count(Binarynode*subTree)
{
    if (subTree != NULL)
    {
        return 1 + count(subTree->leftchild) + count(subTree->rightchild);
    }
    return 0;
}

void BinaryTree::copy()
{
    copy(root);
}
Binarynode* BinaryTree::copy(Binarynode*&Tree)
{
    if (Tree == NULL)
    {
        return NULL;

    }
    else
    {
        Binarynode *tmp = new Binarynode;
        tmp->data = Tree->data;
        tmp->leftchild = copy(Tree->leftchild);
        tmp->rightchild = copy(Tree->rightchild);
        return tmp;
    }
}
void BinaryTree::creatBinTree(Binarynode*&subTree)
{
    DataType item;

    cin >> item;
    if (item != RefValue)
    {
        subTree = new Binarynode;
        subTree->data = item;
        if (subTree == NULL)
        {
            cout << "存储分配错误";
            exit(1);

        }
        creatBinTree(subTree->leftchild);
        creatBinTree(subTree->rightchild);

    }
    else
    {
        subTree = NULL;
    }
}
void BinaryTree::creatBinTree()
{
    creatBinTree(root);
}


void BinaryTree::destory(Binarynode*&Tree)
{

    if (Tree != NULL)
    {
        return;
    }
    destory(Tree->leftchild);
    destory(Tree->rightchild);
    delete Tree;
}

BinaryTree::~BinaryTree()
{
    destory(root);
}


BinaryTree::BinaryTree(BinaryTree &s)
{
    root = copy(s.root);
}
int main()
{
    BinaryTree subTree;
    cout << "输入节点,空结点以#代替:";
    subTree.creatBinTree();
    cout << "前序遍历:";
    subTree.PreOrder();
    cout << endl<<"中序遍历:";
    subTree.InOrder();
    cout << endl << "后序遍历:";
    subTree.PostOrder();
    cout<<endl<<"结点个数:"<<subTree.count()<<endl;
    cout << "树的高度:"<<subTree.Hight()<<endl;
    system("pause");
    return 0;
}

关于链表的输入

这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值