基础数据结构-二叉树-拓展:基于数组存储的构建

用数组存储与前文是类似的,只是换了一个储存方式,有兴趣可以看一下下面的代码,具体就不解释了。

#include<iostream>
#include<string>
using namespace std;

class BiTreeNode
{
public:
    char data;        //结点数据
    BiTreeNode *LeftChild;    //左子树指针
    BiTreeNode *RightChild;        //右子树指针
    BiTreeNode():LeftChild(NULL),RightChild(NULL){}
    ~BiTreeNode(){}
};

class BiTree
{
private:
    BiTreeNode *Root;    //根结点指针
    int pos,len;
    string strTree;
    BiTreeNode *CreateBiTree(int pos);
    void PreOrder(BiTreeNode *t);
    void InOrder(BiTreeNode *t);
    void PostOrder(BiTreeNode *t);
public:
    BiTree(){};
    ~BiTree(){};
    void CreateTree(string TreeArray);
    void PreOrder();
    void InOrder();
    void PostOrder();
};

//构造二叉树,利用先序遍历结果建树
void BiTree::CreateTree(string TreeArray)    //公有函数,对外接口
{
    len = TreeArray.length();    //输入数组的长度
    strTree.assign(TreeArray);    //将输入的数组转存到类的数据strTree中
    Root = CreateBiTree(0);        //从数组0开始读数据
}

BiTreeNode *BiTree::CreateBiTree(int pos)    //在pos位置递归建树,私有函数,类内实现
{    //用参数pos传递当前结点在数组的位置,二叉树性质5,因为数组从0开始编号,父结点是i,左右孩子位置是2i+1,2i+2
    BiTreeNode *T;    //临时指针T
    int ch;
    if(pos>strTree.length())
        return NULL;
    ch=strTree[pos];
    if(ch==‘0‘)
        T = NULL;
    else
    {
        T = new BiTreeNode();
        T->data = ch;        //生成根结点
        if(2*(pos+1) <= len)
            T->LeftChild = CreateBiTree(2*(pos+1)-1);
        if(2*(pos+1)+1 <= len)
            T->RightChild = CreateBiTree(2*(pos+1));
        }
    return T;
}

//定义先序遍历函数
void BiTree::PreOrder()    //公有函数,对外接口
{
    PreOrder(Root);
}

void BiTree::PreOrder(BiTreeNode *t)    //私有函数,类内实现
{
    if(t!=NULL)
    {
        cout << t->data;    //输出当前结点t的数据,表示t已经访问
        PreOrder(t->LeftChild);    //先序遍历t的左孩子
        PreOrder(t->RightChild);    //先序遍历t的右孩子
    }
}

//定义中序遍历函数
void BiTree::InOrder()    //公有函数,对外接口
{
    InOrder(Root);
}

void BiTree::InOrder(BiTreeNode *t)    //私有函数,类内实现
{
    if(t)
    {
        InOrder(t->LeftChild);    //中序遍历t的左孩子
        cout << t->data;        //输出当前结点t的数据,表示t已经访问
        InOrder(t->RightChild);    //中序遍历t的右孩子
    }
}

//后序遍历函数
void BiTree::PostOrder()    //公有函数,对外接口
{
    PostOrder(Root);
}

void BiTree::PostOrder(BiTreeNode *t)    //私有函数,类内实现
{
    if(t)
    {
        PostOrder(t->LeftChild);    //后序遍历t的左孩子
        PostOrder(t->RightChild);    //后序遍历t的右孩子
        cout << t->data;        //输出当前结点t的数据,表示t已经访问
    }
}

int main(void)
{
    int t;
    BiTree T;
    string str;
    cin >> t;
    for(int i=0;i<t;i++)
    {
        cin >> str;
        T.CreateTree(str);
        T.PreOrder();
        cout << endl;
        //T.InOrder();
        //cout << endl;
        //T.PostOrder();
        //cout << endl;
    }
    return 0;
}
时间: 2024-11-01 09:58:07

基础数据结构-二叉树-拓展:基于数组存储的构建的相关文章

数据结构--二叉树(定义与存储结构)

什么是二叉树 是具有n个节点的有限集合,由一个根节点和两棵互不相交二叉树组成.如图 从名字简单理解,就是具有2个树叉的树形结构,当然这不是绝对的,正如上图所示,我也可以只有一个树叉. 二叉树具有五种基本形态: (1)空二叉树 (2)只有一个根结点的二叉树 (3)只有左子树 (4)只有右子树 (5)既有左子树又有右子树 完全二叉树 这种二叉树,是二叉树中常用的专业术语,不是说一个完整的二叉树就是完全二叉树,这种二叉树叫满二叉树,如图 简单理解就像图片中,完全二叉树中每个节点的编号,都能映射到满二叉

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下: //图的数组(邻接矩阵)存储表示和深度优先遍历 const int MAX_VERTEX_NUM=20; //最大顶点数 typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网) typedef int VRType; typedef

数据结构——二叉树概述及其数组(顺序存储)表达法

树与二叉树: 什么是树呢?就是一个节点上会有很多分叉的数据结构.一般的,对于一棵树,我们需要的结构体为一个数据块和几个指针块,这就相当于很多个链表交织在了一起,实际上,链表也可以算是一种特殊的树,而我要讲的,也是一种特殊的树--二叉树. 对于树的各个节点,都有两个属性,称为度(degree),他的意思就是这个节点所拥有的子节点的数量.还有一个属性,称为深度(depth),指节点到根的距离. 什么是二叉树呢?顾名思义,就是度为二的树,它长这样: 如图所示,在链表中我们需要头(head),而在树中我

基于云存储服务构建应用的基础架构(图)

---------------------------------------------------------------------------------- 客户端请求业务层获取数据与授权,业务层存储数据凭证,用于对数据的直接管理: 客户端对私有资源无直接访问权限,必须通过业务层. 上传完成后指定回调方法,执行业务层逻辑. 安全机制,主要使用服务端秘钥生成的凭证.

基础数据结构-二叉树-赫夫曼树的解码(详解)

本篇是上一篇赫夫曼树构建与编码的后续,稍微详细讲一下解码的算法. Huffman解码算法流程: 1.定义指针p指向赫夫曼树结点,实际是记录结点数组的下标: 2.定义指针i指向编码串,定义ch逐个取编码串的字符: 3.初始化:读入编码串,设置p指向根结点,i为0: 4.执行以下循环: a)取编码串的第i个字符放入ch: b)如果ch是字符0,表示往左孩子移动,则p跳转到右孩子: c)如果ch是字符1,表示往右孩子移动,则p跳转到右孩子: d)如果ch非0非1,表示编码串有错误,输出error表示解

数据结构:二叉树的链式存储

数据结构:二叉树的链式存储(C语言版) 1.写在前面 二叉树同样有两种存储方式,数组和链式存储,对于数组来说,我们利用二叉树的性质然后利用下标可以方便的找到一个节点的子节点和父节点. 二叉树的性质: 1.二叉树的第i层上至多有2i-1个节点 2.深度为K的二叉树至多有2k-1个节点 3.任何一个二叉树中度数为2的节点的个数必度数为0的节点数目少1. 说明:度数为0,为叶子节点. 4.具有n个节点的完全二叉树的深度为|_Log2N_|+1 5.若完全二叉树中的某节点编号为i,则若有左孩子编号为2i

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

数据结构 - 基于数组的队列

队列Queue *队列也是一种线性结构 *相比于数组,队列对应的操作是数组的子集 *只能从一端(队尾)添加元素,从另一端(队首)取出元素 *队列是一种先进先出的数据结构(先到先得 First In First Out) 基于数组的队列实现的源码如下: package queue; public interface Queue<E> {        public void enqueue(E e);        public E dequeue();        public E getF

DS二叉树——二叉树之数组存储

二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示.,如下图所示 从上图可以看出,右边的是一颗普通的二叉树,当它与左边的完全二叉树对比,发现它比完全二叉树少了第5号结点,所以在数组中用0表示,同样它还少了完全二叉树中的第10.11号结点,所以在数组中也用0表示.结点存储的数据均为非负整数 输入 第一行输入一个整数t,表示有t个二叉树 第二行起,每行输入一个数组,先输入数组长度,再输入数组