??xml version="1.0" encoding="utf-8" standalone="yes"?>国产欧美久久久精品,精品国产婷婷久久久,久久亚洲国产最新网站http://m.shnenglu.com/cxiaojia/archive/2012/08/20/187776.htmlC加C加Mon, 20 Aug 2012 09:11:00 GMThttp://m.shnenglu.com/cxiaojia/archive/2012/08/20/187776.htmlhttp://m.shnenglu.com/cxiaojia/comments/187776.htmlhttp://m.shnenglu.com/cxiaojia/archive/2012/08/20/187776.html#Feedback3http://m.shnenglu.com/cxiaojia/comments/commentRss/187776.htmlhttp://m.shnenglu.com/cxiaojia/services/trackbacks/187776.html

一步一步写q二叉?wi)(AVL?wi)?j)

作者:(x)C加 更新旉Q?/span>2012-8-20

  q二叉?wi)(Balanced Binary TreeQ是二叉查找?wi)的一个进化体Q也是第一个引入^衡概늚二叉?wi)?962q_(d)G.M. Adelson-Velsky ?E.M. Landis发明?jin)这|(wi)Q所以它又叫AVL?wi)。^衡二叉树(wi)要求对于每一个节Ҏ(gu)_(d)它的左右子树(wi)的高度之差不能超q?Q如果插入或者删除一个节点得高度之差大?Q就要进行节点之间的旋{Q将二叉?wi)重新维持在一个^衡状态。这个方案很好的解决?jin)二叉查找?wi)退化成链表的问题,把插入,查找Q删除的旉复杂度最好情况和最坏情况都l持在O(logN)。但是频J旋转会(x)使插入和删除牺牲掉O(logN)左右的时_(d)不过相对二叉查找?wi)来_(d)旉上稳定了(jin)很多?/p>

  q二叉?wi)实现的大部分过E和二叉查找?wi)是一L(fng)Q学q二叉?wi)之前一定要?x)二叉查找?wi)Q,区别在于插入和删除之后要写一个旋转算法去l持qQ维持^衡需要借助一个节炚w度的属性。我参考了(jin)机械工业出版C《数据结构与法分析-C语言描述》写?jin)一个C++版的代码。这本书的AVLTree讲的很好Q不q没有很完整的去描述。我?x)一步一步的讲解如何写^衡二叉树(wi)Q重Ҏ(gu)q二叉?wi)的核?j)部分Q也是旋{法?/p>

W一步:(x)节点信息

  相对于二叉查找树(wi)的节Ҏ(gu)_(d)我们需要用一个属性二叉树(wi)的高度,目的是维护插入和删除q程中的旋{法?/p>

代码如下Q?/p>

//AVL?wi)节点信?/span>
template<class T>
class TreeNode
{
    public:
        TreeNode():lson(NULL),rson(NULL),freq(1),hgt(0){}
        T data;//?/span>
        int hgt;//以此节点为根的树(wi)的高?/span>
        unsigned int freq;//频率
        TreeNode* lson;//指向左儿子的地址
        TreeNode* rson;//指向叛_子的地址
};

W二步:(x)q二叉?wi)类的声?/strong>

  声明中的旋{函数在后边的步骤中详解?/p>

代码如下Q?/p>

//AVL?wi)类的属性和Ҏ(gu)声明
template<class T>
class AVLTree
{
    private:
        TreeNode<T>* root;//根节?/span>
        void insertpri(TreeNode<T>* &node,T x);//插入
        TreeNode<T>* findpri(TreeNode<T>* node,T x);//查找
        void insubtree(TreeNode<T>* node);//中序遍历
        void Deletepri(TreeNode<T>* &node,T x);//删除
        int height(TreeNode<T>* node);//求树(wi)的高?/span>
        void SingRotateLeft(TreeNode<T>* &k2);//左左情况下的旋{
        void SingRotateRight(TreeNode<T>* &k2);//叛_情况下的旋{
        void DoubleRotateLR(TreeNode<T>* &k3);//左右情况下的旋{
        void DoubleRotateRL(TreeNode<T>* &k3);//叛_情况下的旋{
        int Max(int cmpa,int cmpb);//求最大?/span>

    public:
        AVLTree():root(NULL){}
        void insert(T x);//插入接口
        TreeNode<T>* find(T x);//查找接口
        void Delete(T x);//删除接口
        void traversal();//遍历接口

};

W三步:(x)两个辅助Ҏ(gu)

  旋{法需要借助于两个功能的辅助Q一个是求树(wi)的高度,一个是求两个高度的最大倹{这里规定,一늩?wi)的高度?1Q只有一个根节点的树(wi)的高度ؓ(f)0Q以后每多一层高度加1。ؓ(f)?jin)解x(chng)针NULLq种情况Q写?jin)一个求高度的函敎ͼq个函数q是很有必要的?/p>

代码如下Q?/p>

//计算以节点ؓ(f)根的?wi)的高?/span>
template<class T>
int AVLTree<T>::height(TreeNode<T>* node)
{
    if(node!=NULL)
        return node->hgt;
    return -1;
}
//求最大?/span>
template<class T>
int AVLTree<T>::Max(int cmpa,int cmpb)
{
    return cmpa>cmpb?cmpa:cmpb;
}

W四步:(x)旋{

  对于一个^衡的节点Q由于Q意节Ҏ(gu)多有两个儿子Q因此高度不qӞ此节点的两颗子树(wi)的高度差2.Ҏ(gu)看出Q这U不q出现在下面四U情况:(x)

  1?节点的左子树(wi)3节点高度比右子树(wi)7节点?Q左子树(wi)3节点的左子树(wi)1节点高度大于叛_?节点Q这U情冉|?span data-mce-style="color: #ff0000;" style="color: #ff0000; ">左左?/p>

  2?节点的左子树(wi)2节点高度比右子树(wi)7节点?Q左子树(wi)2节点的左子树(wi)1节点高度于叛_?节点Q这U情冉|?span data-mce-style="color: #ff0000;" style="color: #ff0000; ">左右?/p>

  3?节点的左子树(wi)1节点高度比右子树(wi)5节点?Q右子树(wi)5节点的左子树(wi)3节点高度大于叛_?节点Q这U情冉|?span data-mce-style="color: #ff0000;" style="color: #ff0000; ">叛_?/p>

  4?节点的左子树(wi)1节点高度比右子树(wi)4节点?Q右子树(wi)4节点的左子树(wi)3节点高度于叛_?节点Q这U情冉|?span data-mce-style="color: #ff0000;" style="color: #ff0000; ">叛_?/p>

  从图2中可以可以看出,1?两种情况是对U的Q这两种情况的旋转算法是一致的Q只需要经q一ơ旋转就可以辑ֈ目标Q我们称之ؓ(f)单旋转??两种情况也是对称的,q两U情늚旋{法也是一致的Q需要进行两ơ旋转,我们UC为双旋{?/p>

W五步:(x)单旋?/strong>

  单旋转是针对于左左和叛_q两U情늚解决Ҏ(gu)Q这两种情况是对U的Q只要解决了(jin)左左q种情况Q右叛_很好办了(jin)。图3是左左情늚解决Ҏ(gu)Q节点k2不满_^衡特性,因ؓ(f)它的左子?wi)k1比右子树(wi)Z?层,而且k1子树(wi)中,更深的一层的是k1的左子树(wi)X子树(wi)Q所以属于左左情c(din)?/p>


  Z?wi)恢复^衡,我们把k2变成q棵?wi)的根节点,因?f)k2大于k1Q把k2|于k1的右子树(wi)上,而原本在k1叛_?wi)的Y大于k1Q小于k2Q就把Y|于k2的左子树(wi)上,q样既满了(jin)二叉查找?wi)的性质Q又满?jin)^衡二叉树(wi)的性质?/p>

  q样的操作只需要一部分指针改变Q结果我们得到另外一颗二叉查找树(wi)Q它是一A(ch)VL?wi),因?f)X向上一Ud?jin)一层,Yq停留在原来的层面上QZ向下Ud?jin)一层。整|(wi)的新高度和之前没有在左子?wi)上插入的高度相同,插入操作使得X高度镉K?sh)(jin)。因此,׃q颗子树(wi)高度没有变化Q所以通往根节点的路径׃需要l旋转了(jin)?/p>

代码如下Q?/p>

//左左情况下的旋{
template<class T>
void AVLTree<T>::SingRotateLeft(TreeNode<T>* &k2)
{
    TreeNode<T>* k1;
    k1=k2->lson;
    k2->lson=k1->rson;
    k1->rson=k2;

    k2->hgt=Max(height(k2->lson),height(k2->rson))+1;
    k1->hgt=Max(height(k1->lson),k2->hgt)+1;
}
//叛_情况下的旋{
template<class T>
void AVLTree<T>::SingRotateRight(TreeNode<T>* &k2)
{
    TreeNode<T>* k1;
    k1=k2->rson;
    k2->rson=k1->lson;
    k1->lson=k2;

    k2->hgt=Max(height(k2->lson),height(k2->rson))+1;
    k1->hgt=Max(height(k1->rson),k2->hgt)+1;
}

W六步:(x)双旋?/strong>

  对于左右和右左这两种情况Q单旋{不能使它辑ֈ一个^衡状态,要经q两ơ旋转。双旋{是针对于q两U情늚解决Ҏ(gu)Q同L(fng)Q这样两U情况也是对U的Q只要解决了(jin)左右q种情况Q右左就很好办了(jin)。图4是左x(chng)늚解决Ҏ(gu)Q节点k3不满_^衡特性,因ؓ(f)它的左子?wi)k1比右子树(wi)Z?层,而且k1子树(wi)中,更深的一层的是k1的右子树(wi)k2子树(wi)Q所以属于左x(chng)c(din)?/p>

   Z?wi)恢复^衡,我们需要进行两步,W一步,把k1作ؓ(f)根,q行一ơ右x(chng)转,旋{之后变成了(jin)左左情况Q所以第二步再进行一ơ左左旋转,最后得C(jin)一以k2为根的^衡二叉树(wi)?wi)?/p>

代码如下Q?/p>

//左右情况的旋?/span>
template<class T>
void AVLTree<T>::DoubleRotateLR(TreeNode<T>* &k3)
{
    SingRotateRight(k3->lson);
    SingRotateLeft(k3);
}
//叛_情况的旋?/span>
template<class T>
void AVLTree<T>::DoubleRotateRL(TreeNode<T>* &k3)
{
    SingRotateLeft(k3->rson);
    SingRotateRight(k3);
}

 W七步:(x)插入

  插入的方法和二叉查找?wi)基本一P区别是,插入完成后需要从插入的节点开始维护一个到根节点的路径Q每l过一个节炚w要维持树(wi)的^衡。维持树(wi)的^衡要Ҏ(gu)高度差的特点选择不同的旋转算法?/p>

代码如下Q?/p>

//插入
template<class T>
void AVLTree<T>::insertpri(TreeNode<T>* &node,T x)
{
    if(node==NULL)//如果节点为空,在此节点处加入x信息
    {
        node=new TreeNode<T>();
        node->data=x;
        return;
    }
    if(node->data>x)//如果x于节点的?ql在节点的左子树(wi)中插入x
    {
        insertpri(node->lson,x);
        if(2==height(node->lson)-height(node->rson))
            if(x<node->lson->data)
                SingRotateLeft(node);
            else
                DoubleRotateLR(node);
    }
    else if(node->data<x)//如果x大于节点的?ql在节点的右子树(wi)中插入x
    {
        insertpri(node->rson,x);
        if(2==height(node->rson)-height(node->lson))//如果高度之差?的话失M(jin)q,需要旋?/span>
            if(x>node->rson->data)
                SingRotateRight(node);
            else
                DoubleRotateRL(node);
    }
    else ++(node->freq);//如果相等,把频率?
    node->hgt=Max(height(node->lson),height(node->rson));
}
//插入接口
template<class T>
void AVLTree<T>::insert(T x)
{
    insertpri(root,x);
}

W八步:(x)查找

和二叉查找树(wi)相比Q查找方法没有变法,不过Ҏ(gu)存储的特性,AVL?wi)能l持在一个O(logN)的稳定的旉Q而二叉查找树(wi)则相当不E_?/p>

代码如下Q?/p>

//查找
template<class T>
TreeNode<T>* AVLTree<T>::findpri(TreeNode<T>* node,T x)
{
    if(node==NULL)//如果节点为空说明没找?q回NULL
    {
        return NULL;
    }
    if(node->data>x)//如果x于节点的?ql在节点的左子树(wi)中查找x
    {
        return findpri(node->lson,x);
    }
    else if(node->data<x)//如果x大于节点的?ql在节点的左子树(wi)中查找x
    {
        return findpri(node->rson,x);
    }
    else return node;//如果相等,找C(jin)此节?/span>
}
//查找接口
template<class T>
TreeNode<T>* AVLTree<T>::find(T x)
{
    return findpri(root,x);
}

W九(ji)步:(x)删除

  删除的方法也和二叉查找树(wi)的一_(d)区别是,删除完成后,需要从删除节点的父亲开始向上维护树(wi)的^衡一直到根节炏V?/p>

代码如下Q?/p>

//删除
template<class T>
void AVLTree<T>::Deletepri(TreeNode<T>* &node,T x)
{
    if(node==NULL) return ;//没有扑ֈ值是x的节?/span>
    if(x < node->data)
    {
         Deletepri(node->lson,x);//如果x于节点的?ql在节点的左子树(wi)中删除x
         if(2==height(node->rson)-height(node->lson))
            if(node->rson->lson!=NULL&&(height(node->rson->lson)>height(node->rson->rson)) )
                DoubleRotateRL(node);
            else
                SingRotateRight(node);
    }

    else if(x > node->data)
    {
         Deletepri(node->rson,x);//如果x大于节点的?ql在节点的右子树(wi)中删除x
         if(2==height(node->lson)-height(node->rson))
            if(node->lson->rson!=NULL&& (height(node->lson->rson)>height(node->lson->lson) ))
                DoubleRotateLR(node);
            else
                SingRotateLeft(node);
    }

    else//如果相等,此节点就是要删除的节?/span>
    {
        if(node->lson&&node->rson)//此节Ҏ(gu)两个儿子
        {
            TreeNode<T>* temp=node->rson;//temp指向节点的右儿子
            while(temp->lson!=NULL) temp=temp->lson;//扑ֈ叛_?wi)中值最的节点
            
//把右子树(wi)中最节点的D值给本节?/span>
            node->data=temp->data;
            node->freq=temp->freq;
            Deletepri(node->rson,temp->data);//删除叛_?wi)中最值的节点
            if(2==height(node->lson)-height(node->rson))
            {
                if(node->lson->rson!=NULL&& (height(node->lson->rson)>height(node->lson->lson) ))
                    DoubleRotateLR(node);
                else
                    SingRotateLeft(node);
            }
        }
        else//此节Ҏ(gu)1个或0个儿?/span>
        {
            TreeNode<T>* temp=node;
            if(node->lson==NULL)//有右儿子或者没有儿?/span>
            node=node->rson;
            else if(node->rson==NULL)//有左儿子
            node=node->lson;
            delete(temp);
            temp=NULL;
        }
    }
    if(node==NULL) return;
    node->hgt=Max(height(node->lson),height(node->rson))+1;
    return;
}
//删除接口
template<class T>
void AVLTree<T>::Delete(T x)
{
    Deletepri(root,x);
}

W十步:(x)中序遍历

代码如下Q?/p>

//中序遍历函数
template<class T>
void AVLTree<T>::insubtree(TreeNode<T>* node)
{
    if(node==NULL) return;
    insubtree(node->lson);//先遍历左子树(wi)
    cout<<node->data<<" ";//输出根节?/span>
    insubtree(node->rson);//再遍历右子树(wi)
}
//中序遍历接口
template<class T>
void AVLTree<T>::traversal()
{
    insubtree(root);
}

W十一步:(x)关于效率

  此数据结构插入、查扑֒删除的时间复杂度均ؓ(f)O(logN)Q但是插入和删除需要额外的旋{法需要的旉Q有时旋转过多也?x)?jing)响效率?/p>

  关于递归和非递归。我用的是递归的方法进行插入,查找和删除,而非递归的方法一般来说要比递归的方法快很多Q但是我感觉非递归的方法写出来?x)比较困难,所以我q是选择?jin)递归的方法?/p>

  q有一U效率的问题是关于高度信息的存储Q由于我们需要的仅仅是高度的差,不需要知道这|(wi)的高度,所以只需要用两个二q制位就可以表示q个差。这样可以避免^衡因子的重复计算Q可以稍微的加快一些速度Q不q代码也丧失?jin)相对简明性和清晰度。如果采用递归写法的话Q这U微加速就更显得微乎其微了(jin)?/p>

 

  如果有哪些不对的或者不清晰的地方请指出Q我?x)修改ƈ加以完善?/p>

   附:(x)完整代码

 



C加 2012-08-20 17:11 发表评论
]]>
一步一步写二叉查找?/title><link>http://m.shnenglu.com/cxiaojia/archive/2012/08/09/186752.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Thu, 09 Aug 2012 08:56:00 GMT</pubDate><guid>http://m.shnenglu.com/cxiaojia/archive/2012/08/09/186752.html</guid><wfw:comment>http://m.shnenglu.com/cxiaojia/comments/186752.html</wfw:comment><comments>http://m.shnenglu.com/cxiaojia/archive/2012/08/09/186752.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.shnenglu.com/cxiaojia/comments/commentRss/186752.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/cxiaojia/services/trackbacks/186752.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif""></span></strong></p><p align="center" style="text-align:center"></p><div style="text-align: center;"><strong>一步一步写二叉查找?/strong></div><p> </p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:(x)</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加  <span style="color:red">更新旉Q?/span>2012-8-9</span></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">二叉查找?wi)?/span>BST<span style="font-family:?hu)?">Q是二叉?wi)的一个重要的应用Q它在二叉树(wi)的基上加上了(jin)q样的一个性质Q对于树(wi)中的每一个节Ҏ(gu)_(d)如果有左儿子的话Q它的左儿子的g定小于它本n的|如果有右儿子的话Q它的右儿子的g定大于它本n的倹{?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">二叉查找?wi)的操作一般有插入、删除和查找Q这几个操作的^均时间复杂度都ؓ(f)</span>O(logn)<span style="font-family:?hu)?">Q插入和查找操作很简单,删除操作?x)复杂一点,除此之外Q因Z叉树(wi)的中序遍历是一个有序序列,我就额外加上?jin)一个中序遍历操作?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">二叉查找?wi)的应用不是很多Q因为它最坏的时候跟U性表差不多,大部分会(x)应用到它的升U版Q^衡二叉树(wi)和红黑树(wi)Q这两棵?wi)都能把旉复杂度稳定?/span>O(logn)<span style="font-family:?hu)?">左右。虽然不?x)用刎ͼ但是二叉查找树(wi)是一定要学好的,毕竟它是q二叉?wi)和U黑?wi)的基础?/span></p> <p><span style="font-family:?hu)?">接下来一步一步写一个二叉查找树(wi)模板?a href="/Files/cxiaojia/bst.zip">完整代码下蝲</a></span></p> <p><strong><span style="font-family:?hu)?">W一步:(x)节点信息</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">二叉查找?wi)的节点和二叉?wi)的节点大部分是一L(fng)Q不同的是,二叉查找?wi)多了(jin)一个值出现的ơ数。如?/span>1<span style="font-family:?hu)?">昄?jin)二叉查找?wi)的节点信息?br /><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/bst1.png" width="600" height="148" alt="" /><br /></span></p> <p><span style="font-family:?hu)?">代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">二叉查找?wi)节点信?/span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> TreeNode<br />{<br />    <span style="color: #0000FF; ">public</span>:<br />        TreeNode():lson(NULL),rson(NULL),freq(1){}<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        T data;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>        unsigned <span style="color: #0000FF; ">int</span> freq;<span style="color: #008000; ">//</span><span style="color: #008000; ">频率</span><span style="color: #008000; "><br /></span>        TreeNode* lson;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向左儿子的坐标</span><span style="color: #008000; "><br /></span>        TreeNode* rson;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向叛_子的坐标</span><span style="color: #008000; "><br /></span>};</div><p> </p> <p><strong><span style="font-family:?hu)?">W二步:(x)二叉查找?wi)类的声?/span></strong></p> <p><span style="font-family:?hu)?">代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">二叉查找?wi)类的属性和Ҏ(gu)声明</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> BST<br />{<br />    <span style="color: #0000FF; ">private</span>:<br />        TreeNode<T>* root;<span style="color: #008000; ">//</span><span style="color: #008000; ">根节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> insertpri(TreeNode<T>* &node,T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">插入</span><span style="color: #008000; "><br /></span>        TreeNode<T>* findpri(TreeNode<T>* node,T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">查找</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> insubtree(TreeNode<T>* node);<span style="color: #008000; ">//</span><span style="color: #008000; ">中序遍历</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> Deletepri(TreeNode<T>* &node,T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span>:<br />        BST():root(NULL){}<br />        <span style="color: #0000FF; ">void</span> insert(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">插入接口</span><span style="color: #008000; "><br /></span>        TreeNode<T>* find(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">查找接口</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> Delete(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除接口</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> traversal();<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历接口</span><span style="color: #008000; "><br /></span> <br />};</div><p> </p> <p><strong><span style="font-family:?hu)?">W三步:(x)插入</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">Ҏ(gu)二叉查找?wi)的性质Q插入一个节点的时候,如果根节点ؓ(f)I,此节点作ؓ(f)根节点,如果根节点不为空Q就要先和根节点比较Q如果比根节点的值小Q就插入到根节点的左子树(wi)中,如果比根节点的值大插入到根节点的叛_?wi)中Q如此递归下去Q找到插入的位置。重复节点的插入用值域中的</span>freq<span style="font-family:?hu)?">标记。如?/span>2<span style="font-family:?hu)?">是一个插入的q程?/span></p> <p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/bst2.png" width="634" height="506" alt="" /><br /></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">二叉查找?wi)的旉复杂度要看这|(wi)的Ş态,如果比较接近一一完全二叉树(wi)Q那么时间复杂度?/span>O(logn)<span style="font-family:?hu)?">左右Q如果遇到如?/span>3<span style="font-family:?hu)?">q样的二叉树(wi)的话Q那么时间复杂度׃(x)恢复到线性的</span>O(n)<span style="font-family:?hu)?">?jin)?/span></p> <p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/bst3.png" width="216" height="234" alt="" /><br /></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">q二叉?wi)?x)很好的解军_?/span>3<span style="font-family:?hu)?">q种情况?/span></p> <p><span style="font-family:?hu)?">插入函数的代码如下:(x)</span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">插入</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::insertpri(TreeNode<T>* &node,T x)<br />{<br />    <span style="color: #0000FF; ">if</span>(node==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果节点为空,在此节点处加入x信息</span><span style="color: #008000; "><br /></span>    {<br />        node=<span style="color: #0000FF; ">new</span> TreeNode<T>();<br />        node->data=x;<br />        <span style="color: #0000FF; ">return</span>;<br />    }<br />    <span style="color: #0000FF; ">if</span>(node->data>x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x于节点的?ql在节点的左子树(wi)中插入x</span><span style="color: #008000; "><br /></span>    {<br />        insertpri(node->lson,x);<br />    }<br />    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(node->data<x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x大于节点的?ql在节点的右子树(wi)中插入x</span><span style="color: #008000; "><br /></span>    {<br />        insertpri(node->rson,x);<br />    }<br />    <span style="color: #0000FF; ">else</span> ++(node->freq);<span style="color: #008000; ">//</span><span style="color: #008000; ">如果相等,把频率?</span><span style="color: #008000; "><br /></span>}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">插入接口</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::insert(T x)<br />{<br />    insertpri(root,x);<br />}</div><p> </p> <p><strong><span style="font-family:?hu)?">W四步:(x)查找</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">查找的功能和插入差不多一P按照插入那样的方式递归下去Q如果找C(jin)Q就q回q个节点的地址Q如果没有找刎ͼp?/span>NULL<span style="font-family:?hu)?">?/span></p> <p><span style="font-family:?hu)?">代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">查找</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br />TreeNode<T>* BST<T>::findpri(TreeNode<T>* node,T x)<br />{<br />    <span style="color: #0000FF; ">if</span>(node==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果节点为空说明没找?q回NULL</span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">return</span> NULL;<br />    }<br />    <span style="color: #0000FF; ">if</span>(node->data>x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x于节点的?ql在节点的左子树(wi)中查找x</span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">return</span> findpri(node->lson,x);<br />    }<br />    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(node->data<x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x大于节点的?ql在节点的左子树(wi)中查找x</span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">return</span> findpri(node->rson,x);<br />    }<br />    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">return</span> node;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果相等,找C(jin)此节?/span><span style="color: #008000; "><br /></span>}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">查找接口</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br />TreeNode<T>* BST<T>::find(T x)<br />{<br />    <span style="color: #0000FF; ">return</span> findpri(root,x);<br />}</div><p> </p> <p><strong><span style="font-family:?hu)?">W五步:(x)删除</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">删除?x)麻烦(ch)一点,如果是叶子节点的话,直接删除可以了(jin)。如果只有一个孩子的话,p它的父亲指向它的儿子Q然后删除这个节炏V图</span>4<span style="font-family:?hu)?">昄?jin)一初始树(wi)?/span>4<span style="font-family:?hu)?">节点被删除后的结果。先用一个(f)时指针指?/span>4<span style="font-family:?hu)?">节点Q再?/span>4<span style="font-family:?hu)?">节点的地址指向它的孩子Q这个时?/span>2<span style="font-family:?hu)?">节点的右儿子变成了(jin)</span>3<span style="font-family:?hu)?">节点Q最后删除(f)时节Ҏ(gu)向的I间Q也是</span>4<span style="font-family:?hu)?">节点?/span></p> <p> <img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/bst4.png" width="431" height="241" alt="" /></p> <p><span style="font-family:?hu)?">    删除有两个儿子的节点?x)比较复杂一些。一般的删除{略是用其右子树(wi)最的数据代替该节点的数据q归的删除掉叛_?wi)中最数据的节点。因为右子树(wi)中数据最的节点肯定没有左儿子,所以删除的时候容易一些。图</span>5<span style="font-family:?hu)?">昄?jin)一初始树(wi)?/span>2<span style="font-family:?hu)?">节点被删除后的结果。首先在</span>2<span style="font-family:?hu)?">节点的右子树(wi)中找到最的节点</span>3<span style="font-family:?hu)?">Q然后把</span>3<span style="font-family:?hu)?">的数据赋值给</span>2<span style="font-family:?hu)?">节点Q这个时?/span>2<span style="font-family:?hu)?">节点的数据变?sh)?/span>3<span style="font-family:?hu)?">Q然后的工作是删除叛_?wi)中?/span>3<span style="font-family:?hu)?">节点?jin),采用递归删除?/span></p> <p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/bst5.png" width="431" height="239" alt="" /><br /></p> <p><span style="font-family:?hu)?">    我们发现?/span>2<span style="font-family:?hu)?">节点叛_?wi)的查找q行?jin)两遍,W一遍找到最节点ƈ赋|W二遍删除这个最的节点Q这L(fng)效率q不是很高。你能不能写出只查找一ơ就可以实现赋值和删除两个功能的函数呢Q?/span></p> <p><span style="font-family:?hu)?">    如果删除的次C是很多的话,有一U删除的Ҏ(gu)?x)比较快一点,名字叫懒惰删除法Q当一个元素要被删除时Q它仍留在树(wi)中,只是多了(jin)一个删除的标记。这U方法的优点是删除那一步的旉开销可以避免了(jin)Q如果重新插入删除的节点的话Q插入时也避免了(jin)分配I间的时间开销。缺Ҏ(gu)?wi)的深度会(x)增加,查找的时间复杂度会(x)增加,插入的时间可能?x)增加?/span></p> <p><span style="font-family:?hu)?">删除函数代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">删除</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::Deletepri(TreeNode<T>* &node,T x)<br />{<br />    <span style="color: #0000FF; ">if</span>(node==NULL) <span style="color: #0000FF; ">return</span> ;<span style="color: #008000; ">//</span><span style="color: #008000; ">没有扑ֈ值是x的节?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(x < node->data)<br />    Deletepri(node->lson,x);<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x于节点的?ql在节点的左子树(wi)中删除x</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(x > node->data)<br />    Deletepri(node->rson,x);<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x大于节点的?ql在节点的右子树(wi)中删除x</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果相等,此节点就是要删除的节?/span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">if</span>(node->lson&&node->rson)<span style="color: #008000; ">//</span><span style="color: #008000; ">此节Ҏ(gu)两个儿子</span><span style="color: #008000; "><br /></span>        {<br />            TreeNode<T>* temp=node->rson;<span style="color: #008000; ">//</span><span style="color: #008000; ">temp指向节点的右儿子</span><span style="color: #008000; "><br /></span>            <span style="color: #0000FF; ">while</span>(temp->lson!=NULL) temp=temp->lson;<span style="color: #008000; ">//</span><span style="color: #008000; ">扑ֈ叛_?wi)中值最的节点<br />            </span><span style="color: #008000; ">//</span><span style="color: #008000; ">把右子树(wi)中最节点的D值给本节?/span><span style="color: #008000; "><br /></span>            node->data=temp->data;<br />            node->freq=temp->freq;<br />            Deletepri(node->rson,temp->data);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除叛_?wi)中最值的节点</span><span style="color: #008000; "><br /></span>        }<br />        <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">此节Ҏ(gu)1个或0个儿?/span><span style="color: #008000; "><br /></span>        {<br />            TreeNode<T>* temp=node;<br />            <span style="color: #0000FF; ">if</span>(node->lson==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">有右儿子或者没有儿?/span><span style="color: #008000; "><br /></span>            node=node->rson;<br />            <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(node->rson==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">有左儿子</span><span style="color: #008000; "><br /></span>            node=node->lson;<br />            delete(temp);<br />        }<br />    }<br />    <span style="color: #0000FF; ">return</span>;<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">删除接口</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::Delete(T x)<br />{<br />    Deletepri(root,x);<br />}</div><p> </p> <p><strong><span style="font-family:?hu)?">W六步:(x)中序遍历</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">遍历的方法和二叉?wi)的?gu)一P写这个方法的目的呢,是输?gu)个二叉查找?wi)的有序序列?/span></p> <p><span style="font-family:?hu)?">代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">中序遍历函数</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::insubtree(TreeNode<T>* node)<br />{<br />    <span style="color: #0000FF; ">if</span>(node==NULL) <span style="color: #0000FF; ">return</span>;<br />    insubtree(node->lson);<span style="color: #008000; ">//</span><span style="color: #008000; ">先遍历左子树(wi)</span><span style="color: #008000; "><br /></span>    cout<<node->data<<" ";<span style="color: #008000; ">//</span><span style="color: #008000; ">输出根节?/span><span style="color: #008000; "><br /></span>    insubtree(node->rson);<span style="color: #008000; ">//</span><span style="color: #008000; ">再遍历右子树(wi)</span><span style="color: #008000; "><br /></span>}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">中序遍历接口</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::traversal()<br />{<br />    insubtree(root);<br />}</div><p> </p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">到此Q整个代码就完成?jin),代码中肯定有很多不完善的地方h出,我会(x)加以完善Q谢谢?/span></p> <p>    </p> <p style="text-indent:21.0pt;"><span style="font-family:?hu)?">对于二叉查找?wi)不E_的时间复杂度的解x(chng)案有不少Q^衡二叉树(wi)、展树(wi)和红黑树(wi)都可以解册个问题,但效果是不一L(fng)?/span></p><p><span style="font-family:?hu)?"></span></p><img src ="http://m.shnenglu.com/cxiaojia/aggbug/186752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-09 16:56 <a href="http://m.shnenglu.com/cxiaojia/archive/2012/08/09/186752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q二叉树(wi)Qbinary treeQ?/title><link>http://m.shnenglu.com/cxiaojia/archive/2012/08/06/186432.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Mon, 06 Aug 2012 03:26:00 GMT</pubDate><guid>http://m.shnenglu.com/cxiaojia/archive/2012/08/06/186432.html</guid><wfw:comment>http://m.shnenglu.com/cxiaojia/comments/186432.html</wfw:comment><comments>http://m.shnenglu.com/cxiaojia/archive/2012/08/06/186432.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.shnenglu.com/cxiaojia/comments/commentRss/186432.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/cxiaojia/services/trackbacks/186432.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif"">基本数据l构Q二叉树(wi)Qbinary treeQ?/span></strong></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:(x)</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加  <span style="color:red">更新旉Q?/span>2012-8-6</span></p> <p><span style="font-family:"微Y雅黑","sans-serif"">二叉?wi)首先是一|(wi)Q每个节炚w不能有多于两个的儿子Q也是?wi)的度不能超q?。二叉树(wi)的两个儿子分别称?#8220;左儿?#8221;?#8220;叛_?#8221;Q次序不能颠倒。如?是一个简单的二叉?wi)?br /><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/bintree1.png" width="889" height="373" alt="" /><br /></span></p> <p> </p> <p><strong><span style="font-family:"微Y雅黑","sans-serif"">二叉?wi)的U类</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">一U是满二叉树(wi)Q除?jin)最后一层的叶子节点外,每一层的节点都必L两个儿子节点。如?是一个满二叉?wi)?br /><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/bintree2.png" width="889" height="360" alt="" /><br /></span></p> <p> </p> <p style="text-indent:26.25pt;"><span style="font-family:"微Y雅黑","sans-serif"">另一U是完全二叉?wi),一二叉树(wi)L最后一层后剩下的节点组成的?wi)?f)满二叉树(wi)Q最后一层的节点从左到右q箋(hu)Q没有空出的节点Q这L(fng)?wi)称为完全二叉?wi)。如?是一完全二叉树(wi)?br /><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/bintree_3.png" width="919" height="353" alt="" /><br /></span></p> <p> </p> <p><strong><span style="font-family:"微Y雅黑","sans-serif"">二叉?wi)的实?/span></strong></p> <p style="text-indent:26.25pt;"><span style="font-family:"微Y雅黑","sans-serif"">因ؓ(f)一|(wi)有最多只有两个儿子,所以我们可以用指针直接指向他们。一个节点包括|dataQ、指向左儿子的指针(lsonQ和指向叛_子的指针QrsonQ?/span></p> <p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span> treenode<br />{<br /><span style="color: #0000FF; ">int</span> data;<br /><span style="color: #0000FF; ">struct</span> treenode* lson;<br /><span style="color: #0000FF; ">struct</span> treenode* rson;<br /> <br />}</div></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">二叉?wi)的插?删除,查找和链表差不多,不同的是需要指定是左儿子还是右儿子?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">二叉?wi)的数组实现也很单,假如说根节点在arr[0]q个位置Q那么它的左儿子在arr[2*0+1]Q也是arr[1]q个位置Q它的右儿子在arr[2*0+2] Q也是arr[2]q个位置。对于下标ؓ(f)i的节Ҏ(gu)_(d)它的左儿子的下标?*i+1Q右儿子的下标ؓ(f)2*i+2?/span></p> <p style="text-indent:21.0pt;"><strong><span style="font-family:"微Y雅黑","sans-serif"">二叉?wi)的遍?/span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">二叉?wi)的遍历有三U,分别为先序遍历,中序遍历和后序遍历。这三种遍历方式是根据根节点的读取顺序来分的Q?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">先序遍历Q就是最先读取根节点Q然后再d左子?wi)(按照同样的方法读取子树(wi)上的节点?j)Q最后读取右子树(wi)Q?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">中序遍历Q就是第二个d根节点,最先要d的是左子?wi),然后根节点,最后右子树(wi)Q?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">后序遍历Q就是最后一个读取根节点Q最先读取的是左子树(wi)Q第二个d叛_?wi),最后读取根节点?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">先序遍历的递归实现代码Q?/span></p> <p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span> insubtreeQ?span style="color: #0000FF; ">struct</span> treenode* treeQ?br />{<br />       If(tree==NULL) <span style="color: #0000FF; ">return</span>;<br />       cout<<tree->data;<br />    insubtree(tree->lson);<br />insubtree(tree->rson);<br />}</div></p> <p style="text-indent:21.0pt;"> </p><img src ="http://m.shnenglu.com/cxiaojia/aggbug/186432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-06 11:26 <a href="http://m.shnenglu.com/cxiaojia/archive/2012/08/06/186432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q树(wi)QtreeQ?/title><link>http://m.shnenglu.com/cxiaojia/archive/2012/08/03/186123.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Fri, 03 Aug 2012 01:18:00 GMT</pubDate><guid>http://m.shnenglu.com/cxiaojia/archive/2012/08/03/186123.html</guid><wfw:comment>http://m.shnenglu.com/cxiaojia/comments/186123.html</wfw:comment><comments>http://m.shnenglu.com/cxiaojia/archive/2012/08/03/186123.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/cxiaojia/comments/commentRss/186123.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/cxiaojia/services/trackbacks/186123.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif"">基本数据l构Q树(wi)QtreeQ?/span></strong></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:(x)</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加 <span style="color:red">更新旉Q?/span>2012-8-3</span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">无论是链表,栈还是队列,它们都是U性结构的Q每个节点的左边最多一个节点,双也最多一个节点,对于大量的输入数据,U性表的访问时间太慢,不宜使用。这里我要说一U非U性的数据l构Q其大部分操作的q行旉q_为O(logn)?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">我们涉及(qing)到的q种数据l构叫做?wi)。在计算机科学中Q树(wi)是非常有用的抽象概念。我们Ş象的LqC|(wi)Q一个家族的老祖可能有两个儿子,q两个儿子一个有一个儿子,一个有三个儿子Q像q样发展下去的一个族谱,是一个树(wi)Q如?所C?/span></p> <p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/tree_1.png" border="0" alt="" width="889" height="378" /><br /><br /></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">像一늜正的?wi)一P我们把老祖UCؓ(f)?wi)?两个字儿是分叉开的两个树(wi)枝,q两|(wi)枝可以l向下分成N个树(wi)枝,循环下去Q一直到长出叶子为止?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">我们把老祖或者树(wi)根称为根QrootQ节点,老祖的儿子称为子节点Q每个儿子作为根节点又可以Ş成一|(wi)Q我们把q样的树(wi)UCؓ(f)根节点的子树(wi)?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">?wi)的标准定义Q?/span></p> <p align="left" style="text-indent: 21pt; "><span style="font-family: "微Y雅黑","sans-serif"">?wi)(treeQ是包含nQn>0Q个节点的有I集合,其中Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">  Q?Q每个元素称点(nodeQ;</span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">  Q?Q有一个特定的节点被称为根节点或树(wi)根(rootQ?/span></p> <p align="left" style="text-indent: 21pt; "><span style="font-family: "微Y雅黑","sans-serif"">Q?Q除根节点之外的其余数据元素被分为mQm≥0Q个互不怺的结合T1QT2Q?#8230;…Tm-1Q其中每一个集合TiQ?<=i<=mQ本w也是一|(wi)Q被UC原树(wi)的子?wi)(subtreeQ?/span></p> <p align="left" style="text-indent: 26.25pt; "><span style="font-family: "微Y雅黑","sans-serif"">?wi)具有以下特点?x)</span></p> <p align="left" style="margin-left: 57pt; text-indent: -36pt; "><span style="font-family:"微Y雅黑","sans-serif";">Q?Q?span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">    </span></span><span style="font-family:"微Y雅黑","sans-serif"">每个节点有零个或多个子节炏V?/span></p> <p align="left" style="margin-left: 57pt; text-indent: -36pt; "><span style="font-family:"微Y雅黑","sans-serif";">Q?Q?span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">    </span></span><span style="font-family:"微Y雅黑","sans-serif"">每个子节点只有一个父节点?/span></p> <p align="left" style="margin-left: 57pt; text-indent: -36pt; "><span style="font-family:"微Y雅黑","sans-serif";">Q?Q?span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">    </span></span><span style="font-family:"微Y雅黑","sans-serif"">没有父节点的节点UCؓ(f)根节炏V?/span></p> <p align="left"><strong><span style="font-family:"微Y雅黑","sans-serif"">关于?wi)的一些术?/span></strong></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        节点的度Q一个节点含有的子树(wi)的个数称节点的度Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        叶节Ҏ(gu)l端节点Q度为零的节点称为叶节点Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        非终端节Ҏ(gu)分支节点Q度不ؓ(f)零的节点Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        双亲节点或父节点Q若一个结点含有子节点Q则q个节点UCؓ(f)其子节点的父节点Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        孩子节点或子节点Q一个节点含有的子树(wi)的根节点UCؓ(f)该节点的子节点;</span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        兄弟节点Q具有相同父节点的节点互UCؓ(f)兄弟节点Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        ?wi)的高度或深度?x)定义一|(wi)的根l点层次?Q其他节点的层次是其父结点层ơ加1。一|(wi)中所有结点的层次的最大值称|(wi)的深度。节点的层次Q从根开始定义vQ根为第1层,根的子结点ؓ(f)W?层,以此cLQ?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        ?wi)的度?x)一|(wi)中,最大的节点的度UCؓ(f)?wi)的度?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        节点的祖先:(x)从根到该节点所l分支上的所有节点;</span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        子孙Q以某节点ؓ(f)根的子树(wi)中Q一节点都称节点的子孙?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        林Q由mQm>=0Q棵互不怺的树(wi)的集合称为森林;</span></p> <p align="left"><strong><span style="font-family:"微Y雅黑","sans-serif"">?wi)的实?/span></strong></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">节点的代码如?</span></p> <p align="left"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span> treenode<br />{<br />       <span style="color: #0000FF; ">int</span> data;<br />       <span style="color: #0000FF; ">struct</span> treenode *fistchild;<span style="color: #008000; ">//</span><span style="color: #008000; ">W一个儿?/span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">struct</span> treenode *nextsibling;<span style="color: #008000; ">//</span><span style="color: #008000; ">下一个兄?/span><span style="color: #008000; "><br /></span>}</div></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif""><strong>?wi)的应?/strong></span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">       大部分操作系l的目录l构是采用?wi)结构?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">       ?wi)的U类有很多,?wi)所扩展出来的很多数据结构都有着很大的作用,比如说红黑树(wi)QB?wi),后缀?wi)等{,q将在日后写到?/span></p><img src ="http://m.shnenglu.com/cxiaojia/aggbug/186123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-03 09:18 <a href="http://m.shnenglu.com/cxiaojia/archive/2012/08/03/186123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q队列(queueQ?/title><link>http://m.shnenglu.com/cxiaojia/archive/2012/08/02/186033.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Thu, 02 Aug 2012 07:00:00 GMT</pubDate><guid>http://m.shnenglu.com/cxiaojia/archive/2012/08/02/186033.html</guid><wfw:comment>http://m.shnenglu.com/cxiaojia/comments/186033.html</wfw:comment><comments>http://m.shnenglu.com/cxiaojia/archive/2012/08/02/186033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/cxiaojia/comments/commentRss/186033.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/cxiaojia/services/trackbacks/186033.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif"">基本数据l构Q队列(queueQ?/span></strong></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:(x)</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加 <span style="color:red">更新旉Q?/span>2012-8-2</span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">像栈一P队列QqueueQ也是一U线性表Q它的特性是先进先出Q插入在一端,删除在另一端。就像排队一P刚来的h入队QpushQ要排在队尾(rear)Q每ơ出?pop)的都是队?front)的h。如?Q描qC(jin)一个队列模型?/span></p> <p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/queue1.png" border="0" alt="" width="806" height="269" /><br /></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">和栈一P队列也有数组实现和链表实CU,两种实现都能l出快速的O(1)q行旉Q区别在于链表实现指针域要占用空_(d)频繁的new和delete?x)消耗不的旉开销Q数l实现唯一的缺Ҏ(gu)建立时要定I间大小?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">假如一个队列最多只能站10个hQ当占满10个h后,W?1个h׃能入队,q种情况成ؓ(f)溢出。而如果第一个h出队?jin),剩下?个h依然q在原来的位|,队列里空Z(jin)一个位|,但第11个hq是不能入队Q这U情冉|为假溢出。克服假溢出有效的办法是使用循环队列?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">循环队列是把队֒队首q接hQŞ成一个环Q队下一个位|就是队首,q样可以有效的防止假溢出现象Q但队列的实际容量已然固定?/span></p> <p style="text-indent:21.0pt;"><strong><span style="font-family:"微Y雅黑","sans-serif"">队列的实?/span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">队列的数l实现和栈差不多Q不同的是,栈用top做下标,队列用front和rear作ؓ(f)下标?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">我更改了(jin)单链表的模板来实C个简单的队列。代码仅供学?fn),不之处q请指明Q我?x)对不之处q行修改和更新?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> queueNode<br />{<br />    <span style="color: #0000FF; ">public</span>:<br />    queueNode():next(NULL){}<br />    T data;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>    queueNode* next;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向下一个节点的指针</span><span style="color: #008000; "><br /></span>};<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> myqueue<br />{<br />    <span style="color: #0000FF; ">private</span>:<br />    unsigned <span style="color: #0000FF; ">int</span> queuelength;<br />    queueNode<T>* node;<span style="color: #008000; ">//</span><span style="color: #008000; ">临时节点</span><span style="color: #008000; "><br /></span>    queueNode<T>* rear;<span style="color: #008000; ">//</span><span style="color: #008000; ">队尾</span><span style="color: #008000; "><br /></span>    queueNode<T>* front;<span style="color: #008000; ">//</span><span style="color: #008000; ">队首</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span>:<br />        myqueue();<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        unsigned <span style="color: #0000FF; ">int</span> length();<span style="color: #008000; ">//</span><span style="color: #008000; ">队列元素的个?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> push(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">入队</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">bool</span> isEmpty();<span style="color: #008000; ">//</span><span style="color: #008000; ">判断队列是否为空</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> pop();<span style="color: #008000; ">//</span><span style="color: #008000; ">出队</span><span style="color: #008000; "><br /></span>        T getHead();<span style="color: #008000; ">//</span><span style="color: #008000; ">获得队首元素</span><span style="color: #008000; "><br /></span> <br />};<br />template<<span style="color: #0000FF; ">class</span> T><br />myqueue<T>::myqueue()<br />{<br />    node=NULL;<br />    rear=NULL;<br />    front=NULL;<br />    queuelength=0;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br />inline unsigned <span style="color: #0000FF; ">int</span> myqueue<T>::length(){<span style="color: #0000FF; ">return</span> queuelength;}<br /> <br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myqueue<T>::push(T x)<br />{<br />    node=<span style="color: #0000FF; ">new</span> queueNode<T>();<span style="color: #008000; ">//</span><span style="color: #008000; ">甌一个新的节?/span><span style="color: #008000; "><br /></span>    node->data=x;<span style="color: #008000; ">//</span><span style="color: #008000; ">新节点赋gؓ(f)x</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(rear==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果没有节点则队列为空,node既ؓ(f)队首,又是队尾</span><span style="color: #008000; "><br /></span>    {<br />        front=node;<br />        rear=node;<br />    }<br />    <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果队列非空</span><span style="color: #008000; "><br /></span>    {<br />        rear->next=node;<span style="color: #008000; ">//</span><span style="color: #008000; ">node既ؓ(f)节点的下一个节?/span><span style="color: #008000; "><br /></span>        rear=node;<span style="color: #008000; ">//</span><span style="color: #008000; ">node变成?jin)尾节?把尾节点赋gؓ(f)node</span><span style="color: #008000; "><br /></span>    }<br />    ++queuelength;<span style="color: #008000; ">//</span><span style="color: #008000; ">元素个数+1</span><span style="color: #008000; "><br /></span>}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">bool</span>  myqueue<T>::isEmpty()<br />{<br />    <span style="color: #0000FF; ">return</span> queuelength==0;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myqueue<T>::pop()<br />{<br />    <span style="color: #0000FF; ">if</span>(queuelength==0) <span style="color: #0000FF; ">return</span>;<br />    node=front;<br />    front=front->next;<br />    delete(node);<br />    --queuelength;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br />T  myqueue<T>::getHead()<br />{<br />    <span style="color: #0000FF; ">return</span> front->data;<br />}</div><p> </p> <p style="text-indent:21.0pt;"><strong><span style="font-family:"微Y雅黑","sans-serif"">队列的应?br /></span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">打印机处理作业采用的是队列l构Q它们会(x)按照提交的顺序排列v来。STL也给Z(jin)一个强大的队列Q我们直接可以去用它?/span></p> <p style="text-indent:21.0pt;"><strong><span style="font-family:"微Y雅黑","sans-serif"">队列相关问题</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">如何用两个栈模拟一个队列,如果用两个队列模拟一个栈Q?/span></p><img src ="http://m.shnenglu.com/cxiaojia/aggbug/186033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-02 15:00 <a href="http://m.shnenglu.com/cxiaojia/archive/2012/08/02/186033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q栈QstackQ?/title><link>http://m.shnenglu.com/cxiaojia/archive/2012/08/01/185913.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Wed, 01 Aug 2012 08:51:00 GMT</pubDate><guid>http://m.shnenglu.com/cxiaojia/archive/2012/08/01/185913.html</guid><wfw:comment>http://m.shnenglu.com/cxiaojia/comments/185913.html</wfw:comment><comments>http://m.shnenglu.com/cxiaojia/archive/2012/08/01/185913.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/cxiaojia/comments/commentRss/185913.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/cxiaojia/services/trackbacks/185913.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif"">基本数据l构Q栈QstackQ?/span></strong></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:(x)</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加 <span style="color:red">更新旉Q?/span>2012-8-1</span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">栈(stackQ是限制插入和删除只能在一个位|上q行的线性表Q该位置在表的末端,叫做栈顶。添加元素只能在节点后dQ删除元素只能删除尾节点Q查看节点也只能查看节炏V添加、删除、查看依ơؓ(f)入栈QpushQ、出栈(popQ、栈节点(topQ。Ş象的_(d)栈是一个先q后出(LIFOQ表Q先q去的节点要{到后边q去的节点出来才能出来?/span></p> <p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/stack_1.png" width="921" height="314" alt="" /><br /></p> <p><span style="font-family:"微Y雅黑","sans-serif"">如图1Q是一个栈的Ş象图Qtop指针指向的是栈顶节点Q所以我们可以通过top讉K?节点Q但??节点׃先于2q入q个表,所以是不可见的。如果把0节点当做头节点,2节点当做节点,那么栈限制了(jin)讉K权限Q只可以讉K节炏V?/span></p> <p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/stack_2.png" width="922" height="298" alt="" /><br /></p> <p><span style="font-family:"微Y雅黑","sans-serif"">如图2Q当d一个节?的时候,只能在栈节点,也就是尾节点后添加,q样3节点变成?jin)栈Ӟ?节点变成?jin)不可见节点Q访问的时候只能访问到3节点。入栈时限制?jin)插入地址Q只能在栈顶d节点?/span></p> <p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/stack_3.png" width="922" height="305" alt="" /><br /></p> <p><span style="font-family:"微Y雅黑","sans-serif"">当我们执行出栈的命o(h)Ӟ?的栈元素是3节点Q删除的时候只能允许删除栈的元素Q这样子3节点被删除,top指向删除后的栈顶2节点Q如?所C?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">栈有两种是实现结构,一U是序存储l构Q也是利用数组实现Q一U是铑ּ存储l构Q可以用单链表实现。数l实现栈很简单,用一个下标标记top来表C栈Ӟtop==-1Ӟ栈空Qtop==0Ӟ表示栈里只有一个元素,通过讉KtopZ标的数组元素卛_。出栈top自减Q入栈top自加O(jin)K?jin)?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">单链表实现栈要比单链表的实现单点。我们通过在表的尾端插入来实现pushQ通过删除节Ҏ(gu)实现popQ获取尾节点的元素来表示top。我修改?jin)链表那一章的单链表代码,把头节点当做栈顶节点Q实C(jin)一个简单的栈模板,仅供学习(fn)所用。代码会(x)不定时更新?a href="/Files/cxiaojia/stack.rar">代码下蝲</a></span></p> <p style="text-indent:21.0pt;"><span style="font-family: 微Y雅黑, sans-serif; ">代码如下Q?br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> stackNode<br />{<br />    <span style="color: #0000FF; ">public</span>:<br />    stackNode():next(NULL){}<br />    T data;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>    stackNode* next;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向下一个节点的指针</span><span style="color: #008000; "><br /></span>};<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> mystack<br />{<br />    <span style="color: #0000FF; ">private</span>:<br />    unsigned <span style="color: #0000FF; ">int</span> stacklength;<br />    stackNode<T>* node;<span style="color: #008000; ">//</span><span style="color: #008000; ">临时节点</span><span style="color: #008000; "><br /></span>    stackNode<T>* headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span>:<br />        mystack();<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        unsigned <span style="color: #0000FF; ">int</span> length();<span style="color: #008000; ">//</span><span style="color: #008000; ">栈元素的个数</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> push(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">入栈</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">bool</span> isEmpty();<span style="color: #008000; ">//</span><span style="color: #008000; ">判断栈是否ؓ(f)I?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> pop();<span style="color: #008000; ">//</span><span style="color: #008000; ">出栈</span><span style="color: #008000; "><br /></span>        T top();<span style="color: #008000; ">//</span><span style="color: #008000; ">获得栈顶元素</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> clear();<span style="color: #008000; ">//</span><span style="color: #008000; ">清空?/span><span style="color: #008000; "><br /></span><br />};<br />template<<span style="color: #0000FF; ">class</span> T><br />mystack<T>::mystack()<br />{<br />    node=NULL;<br />    headnode=NULL;<br />    stacklength=0;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br />inline unsigned <span style="color: #0000FF; ">int</span> mystack<T>::length(){<span style="color: #0000FF; ">return</span> stacklength;}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  mystack<T>::push(T x)<br />{<br />    node=<span style="color: #0000FF; ">new</span> stackNode<T>();<br />    node->data=x;<br />    node->next=headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">把node变成头节?/span><span style="color: #008000; "><br /></span>    headnode=node;<br />    ++stacklength;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">bool</span>  mystack<T>::isEmpty()<br />{<br />    <span style="color: #0000FF; ">return</span> stacklength==0;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  mystack<T>::pop()<br />{<br />    <span style="color: #0000FF; ">if</span>(isEmpty()) <span style="color: #0000FF; ">return</span>;<br />    node=headnode;<br />    headnode=headnode->next;<span style="color: #008000; ">//</span><span style="color: #008000; ">头节点变成它的下一个节?/span><span style="color: #008000; "><br /></span>    delete(node);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除头节?/span><span style="color: #008000; "><br /></span>    --stacklength;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br />T  mystack<T>::top()<br />{<br />    <span style="color: #0000FF; ">if</span>(!isEmpty())<br />    <span style="color: #0000FF; ">return</span> headnode->data;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  mystack<T>::clear()<br />{<br />    <span style="color: #0000FF; ">while</span>(headnode!=NULL)<br />    {<br />        node=headnode;<br />        headnode=headnode->next;<br />        delete(node);<br />    }<br />    node=NULL;<br />    headnode=NULL;<br />    stacklength=0;<br />}</div><p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">很清楚,除了(jin)<span lang="EN-US">clear</span>函数外,所有的Ҏ(gu)的时间复杂度都是<span lang="EN-US">O(1)</span>。这U实现方式的~点在于?span lang="EN-US">new</span>?span lang="EN-US">delete</span>的调用的开销是昂늚Q所以采用数l的方式实现?x)更好一炏V?br /><span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif""><strong>栈的应用</strong><span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">使用栈的时候一般不用自己重新去写,因ؓ(f)<span lang="EN-US">STL</span>l我们实C(jin)一个很安全的栈Q可以放?j)去使用?/span><span style="font-size:10.5pt;mso-bidi-font-size:11.0pt; font-family:"微Y雅黑","sans-serif";mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;mso-ansi-language:EN-US;mso-fareast-language: ZH-CN;mso-bidi-language:AR-SA">也可以用数组模拟一个,很简单?/span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">~译器调用函数就用了(jin)栈结构,当第一个函数还没执行完毕,调用W二个函数的时候,~译器就?x)把W一个函数压栈,W二个函数调用完毕的时候,׃(x)取栈函敎ͼ也就是第一个函数l执行?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">qW号 <span lang="EN-US"><a >http://acm.nyist.net/JudgeOnline/problem.php?pid=2</a><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">中缀转后~ <span lang="EN-US"><a >http://acm.nyist.net/JudgeOnline/problem.php?pid=467</a><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">后缀试求?<span lang="EN-US"><a >http://acm.nyist.net/JudgeOnline/problem.php?pid=35</a><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 3250 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=3250</a><o:p></o:p></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 1363 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=1363</a><o:p></o:p></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 1208 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=1208</a><o:p></o:p></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 1686 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=1686</a><o:p></o:p></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 3250 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=2045</a><o:p></o:p></span></p> <pre style="text-indent:21.0pt;mso-char-indent-count:2.0;line-height:11.2pt; background:#FCFEFC"><span lang="EN-US" style="font-size:10.5pt;mso-bidi-font-size: 11.0pt;font-family:"微Y雅黑","sans-serif";mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi">hdu 1022 <a >http://acm.hdu.edu.cn/showproblem.php?pid=1022</a><o:p></o:p></span></pre><span style="font-family: 微Y雅黑, sans-serif; "><br /><br /><br /></span><p> </p><img src ="http://m.shnenglu.com/cxiaojia/aggbug/185913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-01 16:51 <a href="http://m.shnenglu.com/cxiaojia/archive/2012/08/01/185913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q链表(listQ?/title><link>http://m.shnenglu.com/cxiaojia/archive/2012/07/31/185760.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Tue, 31 Jul 2012 09:41:00 GMT</pubDate><guid>http://m.shnenglu.com/cxiaojia/archive/2012/07/31/185760.html</guid><wfw:comment>http://m.shnenglu.com/cxiaojia/comments/185760.html</wfw:comment><comments>http://m.shnenglu.com/cxiaojia/archive/2012/07/31/185760.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/cxiaojia/comments/commentRss/185760.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/cxiaojia/services/trackbacks/185760.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif""><strong>基本数据l构Q链表(listQ?/strong></span></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:(x)</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加 <span style="color:red">更新旉Q?/span>2012-7-31</span></p> <p style="text-indent:20.6pt;"><span style="font-family:"微Y雅黑","sans-serif"">谈到链表之前Q先说一下线性表。线性表是最基本、最单、也是最常用的一U?/span><a target="_blank"><span style="font-family:"微Y雅黑","sans-serif";color:windowtext;text-decoration: none;text-underline:none">数据l构</span></a><span style="font-family:"微Y雅黑","sans-serif"">。线性表中数据元素之间的关系是一对一的关p,即除?jin)第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表有两U存储方式,一U是序存储l构Q另一U是铑ּ存储l构?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">序存储l构是两个盔R的元素在内存?sh)也是相(c)。这U存储方式的优点是查询的旉复杂度ؓ(f)O(1)Q通过首地址和偏U量可以直接访问到某元素,关于查找的适配法很多Q最快可以达到O(logn)。缺Ҏ(gu)插入和删除的旉复杂度最坏能辑ֈO(n)Q如果你在第一个位|插入一个元素,你需要把数组的每一个元素向后移动一位,如果你在W一个位|删除一个元素,你需要把数组的每一个元素向前移动一位。还有一个缺点,是当你不确定元素的数量Ӟ你开的数l必M证能够放下元素最大数量,遗憾的是如果实际数量比最大数量少很多Ӟ你开的数l没有用到的内存只能浪Ҏ(gu)?jin)?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">我们常用的数l就是一U典型的序存储l构Q如??/span></p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/list_1.png" width="650" height="330" alt="" /><br /><p style="text-indent:20.6pt;"><span style="font-family:"微Y雅黑","sans-serif"">铑ּ存储l构是两个盔R的元素在内存?sh)可能不是相(c)Q每一个元素都有一个指针域Q指针域一般是存储着C一个元素的指针。这U存储方式的优点是插入和删除的时间复杂度为O(1)Q不?x)浪费太多内存,d元素的时候才?x)申请内存,删除元素会(x)释攑ֆ存,。缺Ҏ(gu)讉K的时间复杂度最坏ؓ(f)O(n)Q关于查扄法很少Q一般只能遍历,q样旉复杂度也是线性(O(n)Q的?频繁的申请和释放内存?sh)?x)消耗时间?/span></p> <p style="text-indent:20.6pt;"><span style="font-family:"微Y雅黑","sans-serif"">序表的Ҏ(gu)是随机dQ也是讉K一个元素的旉复杂度是O(1)Q链式表的特性是插入和删除的旉复杂度ؓ(f)O(1)。要Ҏ(gu)实际情况去选取适合自己的存储结构?/span></p> <p style="text-indent:20.6pt;"><span style="font-family:"微Y雅黑","sans-serif"">链表是铑ּ存储的线性表。根据指针域的不同,链表分ؓ(f)单向链表、双向链表、@环链表等{?/span></p> <p style="margin-left:43.15pt;text-indent:-22.5pt;"><span style="font-family:"微Y雅黑","sans-serif";">一?</span><span style="font-family:"微Y雅黑","sans-serif"">单向链表QslistQ?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">链表中最单的一U是单向链表Q每个元素包含两个域Q值域和指针域Q我们把q样的元素称之ؓ(f)节点。每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空倹{如?是一个单向链表?/span></p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/list_2.png" border="0" alt="" width="747" height="271" /><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">一个单向链表的节点被分成两个部分。第一个部分保存或者显C关于节点的信息Q第二个部分存储下一个节点的地址。单向链表只可向一个方向遍历?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">我写?jin)一个简单的C++版单向链表类模板Q就用这D代码讲解一下一个具体的单向链表该怎么写(代码仅供学习(fn)Q,当然首先你要具备C++基础知识和简单的模板元编E?br /><a href="/Files/cxiaojia/slist.zip">完整代码</a><br /></span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">首先我们要写一个节点类Q链表中的每一个节点就是一个节点类的对象。如??br /></span></p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/list_3.png" width="771" height="266" alt="" /><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> slistNode<br />{<br />    <span style="color: #0000FF; ">public</span>:<br />    slistNode(){next=NULL;}<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>    T data;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>    slistNode* next;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向下一个节点的指针</span><span style="color: #008000; "><br /></span>};</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W二步,写单链表cȝ声明Q包括属性和Ҏ(gu)?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> myslist<br />{<br />    <span style="color: #0000FF; ">private</span>:<br />    unsigned <span style="color: #0000FF; ">int</span> listlength;<br />    slistNode<T>* node;<span style="color: #008000; ">//</span><span style="color: #008000; ">临时节点</span><span style="color: #008000; "><br /></span>    slistNode<T>* lastnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">头结?/span><span style="color: #008000; "><br /></span>    slistNode<T>* headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">节?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span>:<br />        myslist();<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        unsigned <span style="color: #0000FF; ">int</span> length();<span style="color: #008000; ">//</span><span style="color: #008000; ">链表元素的个?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> add(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">表尾d元素</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> traversal();<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历整个链表q打?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">bool</span> isEmpty();<span style="color: #008000; ">//</span><span style="color: #008000; ">判断链表是否为空</span><span style="color: #008000; "><br /></span>        slistNode<T>* find(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">查找W一个gؓ(f)x的节?q回节点的地址,找不到返回NULL</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> Delete(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除W一个gؓ(f)x的节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> insert(T x,slistNode<T>* p);<span style="color: #008000; ">//</span><span style="color: #008000; ">在p节点后插入gؓ(f)x的节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> insertHead(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">在链表的头部插入节点</span><span style="color: #008000; "><br /></span>};</div><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W三步,写构造函敎ͼ初始化链表类的属性?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br />myslist<T>::myslist()<br />{<br />    node=NULL;<br />    lastnode=NULL;<br />    headnode=NULL;<br />    listlength=0;<br />}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W四步,实现add()Ҏ(gu)?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::add(T x)<br />{<br />    node=<span style="color: #0000FF; ">new</span> slistNode<T>();<span style="color: #008000; ">//</span><span style="color: #008000; ">甌一个新的节?/span><span style="color: #008000; "><br /></span>    node->data=x;<span style="color: #008000; ">//</span><span style="color: #008000; ">新节点赋gؓ(f)x</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(lastnode==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果没有节点则链表为空,node既ؓ(f)头结?又是节?/span><span style="color: #008000; "><br /></span>    {<br />        headnode=node;<br />        lastnode=node;<br />    }<br />    <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果链表非空</span><span style="color: #008000; "><br /></span>    {<br />        lastnode->next=node;<span style="color: #008000; ">//</span><span style="color: #008000; ">node既ؓ(f)节点的下一个节?/span><span style="color: #008000; "><br /></span>        lastnode=node;<span style="color: #008000; ">//</span><span style="color: #008000; ">node变成?jin)尾节?把尾节点赋gؓ(f)node</span><span style="color: #008000; "><br /></span>    }<br />    ++listlength;<span style="color: #008000; ">//</span><span style="color: #008000; ">元素个数+1</span><span style="color: #008000; "><br /></span>}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W五步,实现traversal()函数Q遍历ƈ输出节点信息?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?br /></span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::traversal()<br />{<br />    node=headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">用(f)时节Ҏ(gu)向头l点</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">while</span>(node!=NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历链表q输?/span><span style="color: #008000; "><br /></span>    {<br />        cout<<node->data<<ends;<br />        node=node->next;<br />    }<br />    cout<<endl;<br />}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W六步,实现isEmpty()函数Q判断链表是否ؓ(f)I,q回真ؓ(f)I,假则不空?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">bool</span>  myslist<T>::isEmpty()<br />{<br />    <span style="color: #0000FF; ">return</span> listlength==0;<br />}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W七步,实现find()函数?/span></p> <p style="text-indent: 20.45pt; "><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?br /></span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br />slistNode<T>* myslist<T>::find(T x)<br />{<br />    node=headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">用(f)时节Ҏ(gu)向头l点</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">while</span>(node!=NULL&&node->data!=x)<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历链表,遇到值相同的节点跛_</span><span style="color: #008000; "><br /></span>    {<br />        node=node->next;<br />    }<br />    <span style="color: #0000FF; ">return</span> node;<span style="color: #008000; ">//</span><span style="color: #008000; ">q回扑ֈ的节点的地址,如果没有扑ֈ则返回NULL</span><span style="color: #008000; "><br /></span>}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W八步,实现delete()函数Q删除第一个gؓ(f)x的节点,如图4?/span></p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/list_4.png" width="771" height="259" alt="" /><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::Delete(T x)<br />{<br />    slistNode<T>* temp=headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">甌一个(f)时节Ҏ(gu)向头节点</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(temp==NULL) <span style="color: #0000FF; ">return</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果头节点ؓ(f)I?则该链表无元?直接q回</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(temp->data==x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果头节点的gؓ(f)要删除的?则删除投节点</span><span style="color: #008000; "><br /></span>    {<br />        headnode=temp->next;<span style="color: #008000; ">//</span><span style="color: #008000; ">把头节点指向头节点的下一个节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">if</span>(temp->next==NULL) lastnode=NULL;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果链表中只有一个节?删除之后没有节点了(jin),把尾节点|ؓ(f)I?/span><span style="color: #008000; "><br /></span>        delete(temp);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除头节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">return</span>;<br />    }<br />    <span style="color: #0000FF; ">while</span>(temp->next!=NULL&&temp->next->data!=x)<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历链表扑ֈW一个gx相等的节?temp表示q个节点的上一个节?/span><span style="color: #008000; "><br /></span>    {<br />        temp=temp->next;<br />    }<br />    <span style="color: #0000FF; ">if</span>(temp->next==NULL) <span style="color: #0000FF; ">return</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果没有扑ֈ则返?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(temp->next==lastnode)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果扑ֈ的时候尾节点</span><span style="color: #008000; "><br /></span>    {<br />        lastnode=temp;<span style="color: #008000; ">//</span><span style="color: #008000; ">把尾节点指向他的上一个节?/span><span style="color: #008000; "><br /></span>        delete(temp->next);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除节?/span><span style="color: #008000; "><br /></span>        temp->next=NULL;<br />    }<br />    <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果不是节?如图4</span><span style="color: #008000; "><br /></span>    {<br />        node=temp->next;<span style="color: #008000; ">//</span><span style="color: #008000; ">用(f)时节点node指向要删除的节点</span><span style="color: #008000; "><br /></span>        temp->next=node->next;<span style="color: #008000; ">//</span><span style="color: #008000; ">要删除的节点的上一个节Ҏ(gu)向要删除节点的下一个节?/span><span style="color: #008000; "><br /></span>        delete(node);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除节点</span><span style="color: #008000; "><br /></span>        node=NULL;<br />    }<br />}</div><p class="MsoNormal" style="text-indent:20.45pt;mso-char-indent-count:1.95"><span style="font-family:"微Y雅黑","sans-serif"">W九(ji)步,实现<span lang="EN-US">insert()</span>?span lang="EN-US">insertHead()</span>函数Q在<span lang="EN-US">p</span>节点后插入gؓ(f)<span lang="EN-US">x</span>的节炏V如?span lang="EN-US">5</span>?span lang="EN-US"><o:p></o:p></span></span></p><span style="font-family:"微Y雅黑","sans-serif""><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/list_5.png" width="769" height="296" alt="" /><br /><br /></span><p> </p><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::insert(T x,slistNode<T>* p)<br />{<br />    <span style="color: #0000FF; ">if</span>(p==NULL) <span style="color: #0000FF; ">return</span>;<br />    node=<span style="color: #0000FF; ">new</span> slistNode<T>();<span style="color: #008000; ">//</span><span style="color: #008000; ">甌一个新的空?/span><span style="color: #008000; "><br /></span>    node->data=x;<span style="color: #008000; ">//</span><span style="color: #008000; ">如图5</span><span style="color: #008000; "><br /></span>    node->next=p->next;<br />    p->next=node;<br />    <span style="color: #0000FF; ">if</span>(node->next==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果node为尾节点</span><span style="color: #008000; "><br /></span>    lastnode=node;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::insertHead(T x)<br />{<br />    node=<span style="color: #0000FF; ">new</span> slistNode<T>();<br />    node->data=x;<br />    node->next=headnode;<br />    headnode=node;<br />}</div><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">最l,我们完成一个简单的单向链表。此单向链表代码q有很多待完善的地方Q以后会(x)修改代码q不定时更新?/span></p> <p style="margin-left:43.15pt;text-indent:-22.5pt;"><span style="font-family: 微Y雅黑, sans-serif; ">二?</span><span style="font-family:"微Y雅黑","sans-serif"">双向链表</span></p> <p style="margin-left:20.7pt; text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">双向链表的指针域有两个指针,每个数据l点分别指向直接后和直接前驱。单向链表只能从表头开始向后遍历,而双向链表不但可以从前向后遍历,也可以从后向前遍历。除?jin)双向遍历的优点Q双向链表的删除的时间复杂度?x)降为OQ?Q,因ؓ(f)直接通过目的指针可以找到前p点,单向链表得从表头开始遍历寻扑։p炏V缺Ҏ(gu)每个节点多了(jin)一个指针的I间开销。如?是一个双向链表?/span></p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/list_6.png" width="813" height="236" alt="" /><br /><br /><p style="margin-left:43.15pt;text-indent:-22.5pt;"><span style="font-family:"微Y雅黑","sans-serif";">三?</span><span style="font-family:"微Y雅黑","sans-serif"">循环链表</span></p> <p style="margin-left:20.7pt; text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">循环链表是让链表的最后一个节Ҏ(gu)向第一个节点,q样Ş成了(jin)一个圆环,可以循环遍历。单向@环链表可以单向@环遍历,双向循环链表的头节点的指针也要指向最后一个节点,q样的可以双向@环遍历。如?是一个双向@环链表?/span></p><img src="http://m.shnenglu.com/images/cppblog_com/cxiaojia/list_7.png" width="736" height="257" alt="" /><br /><p> </p><p style="margin-left:43.15pt;text-indent:-22.5pt;"><span style="font-family:"微Y雅黑","sans-serif";">四?</span><span style="font-family:"微Y雅黑","sans-serif"">链表相关问题</span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.7pt;text-indent:5.55pt;line-height:12.15pt;background:white"><span style="font-size: 10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">1</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何判断一个单链表有环</span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 0cm;text-indent:20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  2</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何判断一个环的入口点在哪?/span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  3</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何知道环的长?/span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  4</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何知道两个单链表Q无环)(j)是否怺</span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  5</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如果两个单链表Q无环)(j)怺Q如何知道它们相交的W一个节Ҏ(gu)什?/span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  6</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何知道两个单链表Q有环)(j)是否怺</span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  7</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如果两个单链表Q有环)(j)怺Q如何知道它们相交的W一个节Ҏ(gu)什?/span></p><br />       <a style="text-decoration: underline; " title="{案" target="_blank">{案</a><br /><br /><br /><img src ="http://m.shnenglu.com/cxiaojia/aggbug/185760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-07-31 17:41 <a href="http://m.shnenglu.com/cxiaojia/archive/2012/07/31/185760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hash_map哈希映照容器的实?/title><link>http://m.shnenglu.com/cxiaojia/archive/2012/04/18/171901.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Wed, 18 Apr 2012 12:18:00 GMT</pubDate><guid>http://m.shnenglu.com/cxiaojia/archive/2012/04/18/171901.html</guid><wfw:comment>http://m.shnenglu.com/cxiaojia/comments/171901.html</wfw:comment><comments>http://m.shnenglu.com/cxiaojia/archive/2012/04/18/171901.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.shnenglu.com/cxiaojia/comments/commentRss/171901.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/cxiaojia/services/trackbacks/171901.html</trackback:ping><description><![CDATA[<div><p>hash_map<span style="font-family: ?hu)?">Q顾名思义Q就是利?/span>hash_set<span style="font-family:?hu)?">存储l构的写</span>map<span style="font-family:?hu)?">映照容器Q普通的</span>map<span style="font-family:?hu)?">用的是红黑树(wi)存储l构写的。元素的(g)索时间对比,</span>hash_set<span style="font-family:?hu)?">q似?/span>O(1)<span style="font-family:?hu)?">Q红黑树(wi)?/span>O(logn)<span style="font-family:?hu)?">?/span>Hash_map<span style="font-family:?hu)?">的空间开销要比</span>map <span style="font-family:?hu)?">的空间开销大,其是我用数l模拟指针写?/span>hash_map<span style="font-family:?hu)?">?/span></p> <p><span style="font-family:?hu)?">所以,如果有必要采取映结构的时候,能用</span>hash_map<span style="font-family:?hu)?">别?/span>map<span style="font-family:?hu)?">?/span></p> <p><span style="font-family:?hu)?">需要注意的是,</span>hash_map<span style="font-family:?hu)?">遍历出来的元素不是有序的?/span></p> <p>Hash_map<span style="font-family: ?hu)?">和普?/span>hash_set<span style="font-family:?hu)?">相比的话Q?/span>hash_map<span style="font-family:?hu)?">?/span>hash_set<span style="font-family:?hu)?">多了(jin)一?/span>value<span style="font-family:?hu)?">表,也就是映表?/span></p> <p> </p> <p><span style="font-family:?hu)?">下面?/span>hash_map<span style="font-family:?hu)?">的模板,?/span>hash_set<span style="font-family: ?hu)? ">的模板差不多?br /><br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> KeyType,<span style="color: #0000FF; ">int</span> MaxHash><br /><span style="color: #0000FF; ">struct</span> HashFunction<br />{<br />    <span style="color: #0000FF; ">int</span> <span style="color: #0000FF; ">operator</span>()(<span style="color: #0000FF; ">const</span> KeyType& key)<br />    {<br />        <span style="color: #0000FF; ">int</span> h=key%MaxHash;<br />        <span style="color: #0000FF; ">if</span> (h<0) h+=MaxHash;<br />        <span style="color: #0000FF; ">return</span> h;<br />    }<br />};<br /><br />template<<span style="color: #0000FF; ">class</span> KeyType,<span style="color: #0000FF; ">class</span> ValueType,<span style="color: #0000FF; ">int</span> KeyContain,<span style="color: #0000FF; ">int</span> MaxHash,<span style="color: #0000FF; ">class</span> HashFun=HashFunction<KeyType,MaxHash> ><br /><span style="color: #0000FF; ">class</span> HashMap<br />{<br /><span style="color: #0000FF; ">public</span>:<br />    HashMap():hashfun(){Clear();}<br />    ValueType& <span style="color: #0000FF; ">operator</span>[](<span style="color: #0000FF; ">const</span> KeyType& key)<br />    {<br />        <span style="color: #0000FF; ">int</span> h=hashfun(key);<br />        <span style="color: #0000FF; ">int</span> pos=head[h];<br />        <span style="color: #0000FF; ">for</span>(;pos!=0;pos=next[pos])<br />        {<br />            <span style="color: #0000FF; ">if</span>(keys[pos]==key)<br />                <span style="color: #0000FF; ">return</span> values[pos];<br />        }<br />        next[++top]=head[h];<br />        head[h]=top;<br />        keys[top]=key;<br />        values[top]=ValueType();<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        ++sz;<br />        <span style="color: #0000FF; ">return</span> values[top];<br />    }<br />    <span style="color: #0000FF; ">void</span> Clear()<br />    {<br />        memset(head,0,<span style="color: #0000FF; ">sizeof</span>(head));<br />        memset(next,0,(top+1)*<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">int</span>));<br />        top=0;<br />        sz=0;<br />    }<br />    unsigned <span style="color: #0000FF; ">int</span> size() <span style="color: #0000FF; ">const</span> {<span style="color: #0000FF; ">return</span> sz;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />    unsigned <span style="color: #0000FF; ">int</span> sz;<br />    HashFun hashfun;<br />    <span style="color: #0000FF; ">int</span> head[MaxHash];<br />    <span style="color: #0000FF; ">int</span> next[KeyContain];<br />    KeyType keys[KeyContain];<br />    ValueType values[KeyContain];<br />    <span style="color: #0000FF; ">int</span> top;<br />};</div><p> </p></div><img src ="http://m.shnenglu.com/cxiaojia/aggbug/171901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-04-18 20:18 <a href="http://m.shnenglu.com/cxiaojia/archive/2012/04/18/171901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>区间某个数出现的ơ数http://m.shnenglu.com/cxiaojia/archive/2012/03/26/168993.htmlC加C加Mon, 26 Mar 2012 04:55:00 GMThttp://m.shnenglu.com/cxiaojia/archive/2012/03/26/168993.htmlhttp://m.shnenglu.com/cxiaojia/comments/168993.htmlhttp://m.shnenglu.com/cxiaojia/archive/2012/03/26/168993.html#Feedback0http://m.shnenglu.com/cxiaojia/comments/commentRss/168993.htmlhttp://m.shnenglu.com/cxiaojia/services/trackbacks/168993.html

l你一串数字,让你求出某个子串中某个数字出现的ơ数?/span>

用邻接表储存每个数出现的位置Q然后对L表进行二分查找,扑և区间?/span>



C加 2012-03-26 12:55 发表评论
]]>
优秀博客推荐Q各U数据结构与法知识入门l典Q不断更?http://m.shnenglu.com/cxiaojia/archive/2011/11/16/rumen.htmlC加C加Wed, 16 Nov 2011 07:58:00 GMThttp://m.shnenglu.com/cxiaojia/archive/2011/11/16/rumen.htmlhttp://m.shnenglu.com/cxiaojia/comments/160269.htmlhttp://m.shnenglu.com/cxiaojia/archive/2011/11/16/rumen.html#Feedback7http://m.shnenglu.com/cxiaojia/comments/commentRss/160269.htmlhttp://m.shnenglu.com/cxiaojia/services/trackbacks/160269.html

 

作者:(x)C加 更新旉Q?/span>2012-8-16

Ƣ迎自荐?span style="color: red; ">推荐链接。请于留a处告知?br />
基本法
贪心(j)法Q?a title="贪心(j)法" target="_blank">贪心(j)法 作者:(x)独酌途R
               贪心(j)法_讲 
作者:(x)3522021224
递归和分治:(x)递归与分ȝ?/a> 作者:(x)zhoudaxia

图论
囄遍历QDFS和BFSQ:(x)  
囄遍历 作者:(x)jefferent
最生成树(wi)QPrim法和Kruskal法Q:(x) 贪心(j)法--最生成树(wi) 作者:(x)独酌途R
Dijkstra法Q?nbsp;最短\径之Dijkstra法详细讲解 作者:(x)l岩
                   最短\径算?#8212;Dijkstra(q杰斯特?法分析与实?C/C++) 作者:(x)tankywoo
Bellman-Ford法Q?a title="最短\径算?#8212;Bellman-Ford(贝尔?特)法分析与实?C/C++)" target="_blank">最短\径算?#8212;Bellman-Ford(贝尔?特)法分析与实?C/C++)  作者:(x)tankywoo
Floyd-Warshall法Q?a title="最短\径算?#8212;Floyd(弗洛伊d)法分析与实?C/C++)">最短\径算?#8212;Floyd(弗洛伊d)法分析与实?C/C++) 作者:(x)tankywoo
Johnson法Q?a title="Johnson 法">Johnson 法 作者:(x)huliang82
A*法Q?/span>A*法详解 作者:(x)愚h有节
拓扑排序Q?a title="拓扑排序">拓扑排序  作者:(x)
midgard

              如何ȝ?拓扑排序法 作者:(x)张善?/strong>
关键路径Q?a title="关键路径" target="_blank">关键路径 作者:(x)navorse
Ƨ拉路:(x)Ƨ拉路问?/a> 作者:(x)MaiK
差分U束Q?a title="差分U束pȝ">差分U束pȝ 作者:(x)fuliang
二分图最大匹配:(x)二分囑֌配ȝ 作者:(x)北极天南?br />                           二分囑֌配算法ȝ 作者:(x)z7m8v6
|络:(x)|络基 作者:(x)chhaj523

数据l构
链表:基本数据l构Q链表(listQ?/span> 作?C加
?
基本数据l构Q栈QstackQ?/a> 作?C加 
队列:
基本数据l构Q队列(queueQ?/a> 作?C加 
 ?
基本数据l构Q树(wi)QtreeQ?/a> 作?C加  
二叉?
C加 
二叉查找?
一步一步写二叉查找?/a>  作?C加  
q查集:(x)
q查?-学习(fn)详解 作者:(x)yx_th000
哈希表:(x)猎h?/span>
二分查找Q?a title="查找Q二Q:(x)二分查找">查找Q二Q:(x)二分查找
 作者:(x)xiaosuo
哈夫曼树(wi)Q?/span>哈夫曼树(wi) 作者:(x)angle
q二叉?wi)?x) q二叉?wi)(解惑Q?/a> 作者:(x)Never
?wi)状数组Q?a target="_blank">?wi)状数组ȝ 作者:(x)熊猫yingcai
U段?wi)?x) U段?wi)ȝ 作者:(x)星星
归ƈ排序求逆序敎ͼ(x)kahn


动态规划(DPQ?/span>
单动态规划:(x)brokencode

背包问题Q《背包九(ji)讌Ӏ?br />

数学
遗传法Q?nbsp;遗传法入门 作者:(x)heaad
Ҏ(gu)原理Q?a href="http://m.shnenglu.com/vici/archive/2011/09/05/155103.html" title="Ҏ(gu)原理Q翻译)(j)" target="_blank">Ҏ(gu)原理Q翻译)(j) 作者:(x)vici
母函敎ͼ(x)母函数入门小l?/a> 作者:(x)zhangxiang0125
U九(ji)韶算法:(x)
simonezhlx

高斯消元法:(x)
Ƨ几里得定理QGCDQ:(x)
扩展Ƨ几里得定理Q?/span>
中国剩余定理Q?/span>
概率问题Q?/span>

计算几何
几何公式Q?br />L化:(x) 
什么是L化? 作者:(x)matrix67
扫描U算法:(x)
叉积和点U:(x)
凸包Q?br />




C加 2011-11-16 15:58 发表评论
]]>
KMP法中关于next数组的探I?/title><link>http://m.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Tue, 20 Sep 2011 10:11:00 GMT</pubDate><guid>http://m.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html</guid><wfw:comment>http://m.shnenglu.com/cxiaojia/comments/156343.html</wfw:comment><comments>http://m.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://m.shnenglu.com/cxiaojia/comments/commentRss/156343.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/cxiaojia/services/trackbacks/156343.html</trackback:ping><description><![CDATA[     摘要: 从《严书》上看到?jin)KMP法Q看?jin)一遍没懂,但觉得挺奇的,p费了(jin)几天旉深入的理解。算法的原理其实不难Q难的就是那个y妙的next数组Q这个next数组很吸引我Q我的大部分旉也都是花费在q个数组上面的。这个next数组是KMP里面一个很关键的地方,对于在数据结构书上看q一遍整个算法流E的人,能够把next数组搞明白,整个KMP法的整体思想差不多理解?jin)。然后在一些细节上面深入思考一下,可...  <a href='http://m.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html'>阅读全文</a><img src ="http://m.shnenglu.com/cxiaojia/aggbug/156343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2011-09-20 18:11 <a href="http://m.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.enetbase.cn" target="_blank">ձƷþþþĻ8</a>| <a href="http://www.qh298.cn" target="_blank">Ʒþ8xѹۿ</a>| <a href="http://www.hlbelss.org.cn" target="_blank">88þþƷһëƬ</a>| <a href="http://www.gpci.cn" target="_blank">97þþƷˬ</a>| <a href="http://www.9dqmu.cn" target="_blank">ľƷþþþ</a>| <a href="http://www.hdv1p7.cn" target="_blank">ҹþþþþþþþ</a>| <a href="http://www.dageda168.cn" target="_blank">޾Ʒþþþȥq </a>| <a href="http://www.wyj448.cn" target="_blank">99þѹۺϾƷ</a>| <a href="http://www.elishe.cn" target="_blank">þ99ƷСѼ</a>| <a href="http://www.r234.cn" target="_blank">Ʒ˿þþþþò </a>| <a href="http://www.tjonline.com.cn" target="_blank">Ʒþþþþþþҹ</a>| <a href="http://www.fcsyx.cn" target="_blank">Ʒŷþþþ޹</a>| <a href="http://www.gll-gx.cn" target="_blank">AVþþƷɫ</a>| <a href="http://www.dfyxw.cn" target="_blank">Ʒþۺ123</a>| <a href="http://www.vltr.cn" target="_blank">þþƷĻ鶹</a>| <a href="http://www.828wlp.cn" target="_blank">þۺ¶þü</a>| <a href="http://www.jwpicture.cn" target="_blank">ŷһþ</a>| <a href="http://www.sidongliiang.cn" target="_blank">þþþó˾Ʒ</a>| <a href="http://www.dg-rx.cn" target="_blank">Ʒþþþ9999</a>| <a href="http://www.13gf.cn" target="_blank">츾þþ</a>| <a href="http://www.thebeaver.cn" target="_blank">þþ뾫Ʒҹ</a>| <a href="http://www.vanblog.cn" target="_blank">ɫۺϾþۺۿ</a>| <a href="http://www.chaikuo.cn" target="_blank">þþƷ</a>| <a href="http://www.jblw.net.cn" target="_blank">þ˿ྫƷĻ</a>| <a href="http://www.hywsgc.cn" target="_blank">ƷȾþav</a>| <a href="http://www.guer.org.cn" target="_blank">ݺɫݺݺݺݺɫۺϾþ </a>| <a href="http://www.smscx.cn" target="_blank">޹þþþƷ</a>| <a href="http://www.0513act.cn" target="_blank">ۺϳ˾þôƬ91</a>| <a href="http://www.zhouyimen.cn" target="_blank">þþƷһ</a>| <a href="http://www.alexa178.cn" target="_blank">þ99Ʒ鶹</a>| <a href="http://www.hzjslh.cn" target="_blank">Ʒþþø</a>| <a href="http://www.hthotel.com.cn" target="_blank">þ99ƷþֻоƷ</a>| <a href="http://www.ganzhoupei.cn" target="_blank">һþ֪ۺϾþ</a>| <a href="http://www.hellorolex.cn" target="_blank">ݺɫۺվþþþþþø</a>| <a href="http://www.hnxxzw.cn" target="_blank">þĻ</a>| <a href="http://www.enkids.cn" target="_blank">޳avƬþ</a>| <a href="http://www.su26.cn" target="_blank">ҹ888þ</a>| <a href="http://www.www9785.cn" target="_blank">þøһëƬ</a>| <a href="http://www.gxsc.net.cn" target="_blank">Ʒþþþ</a>| <a href="http://www.uutools.cn" target="_blank">þֻоƷƵ99</a>| <a href="http://www.i231.cn" target="_blank">þۺϾƷþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>