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


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

    #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;
    }
  • 相关阅读:
    WPF中DataGrid的应用-绑定,增改删,分页,样式
    每隔一秒获取时间
    常识
    VS2013程序打包部署详细图解
    Vs2010 WPF 项目打包
    WPF InkCanvas 画图 基础使用教程
    WPF Template模版之寻找失落的控件【三】
    WPF Template模版之DataTemplate与ControlTemplate【一】
    WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】
    淡入效果
  • 原文地址:https://www.cnblogs.com/nathaneko/p/6491927.html
Copyright © 2020-2023  润新知