[C++11] 顺序存储的完全二叉树构造树形结构

来源:互联网 发布:java错误等级 编辑:程序博客网 时间:2024/06/06 12:49

     我们知道,二叉树有两种基本的存储方式:顺序存储方式和树形存储方式。在用代码实现之前,我们先来分析一下我们的思路:

     (1)分析

               假定我们采用如下结构来顺序存储一棵二叉树。

              不难看出seq是一个动态数组vector,其中的每一个元素都是一个指向type类型的指针(type*)

                        

      

            对于上面例子中的二叉树,等价于如下表示的树形结构

                                                                     

               我们能够很容易的发现两者之间的对应关系:1、seq表示的序列就是二叉树层序遍历的结果;2、设seq的最大下标为n,则n==seq.size()-1。3、假设某一结点下标为 i ,则其左子女的下标为 2*i+1,右子女的下标为2*i+2

          (2)构造函数的代码实现

    binaryTree(const vector<shared_ptr<type>> seq)    {        vector<shared_ptr<treeNode<type>>> vec(seq.size());        for(unsigned int i=0;i<seq.size();i++)      //第一层循环实现了type*向treeNode*的转换        {            if(seq[i]==nullptr)                vec[i]=nullptr;            else            {                vec[i]=shared_ptr<treeNode<type>>(new treeNode<type>(*seq[i]));            }        }        for(unsigned int i=0;i<vec.size();i++)        {            if(vec[i]!=nullptr)     //此处判空很关键            {                if(2*i+1<vec.size())                    vec[i]->LeftChild=vec[2*i+1];                if(2*i+2<vec.size())                    vec[i]->RightChild=vec[2*i+2];            }        }        _root=vec[0];    }





0 0
原创粉丝点击