数据结构 请问那个终态图中 parent lchild rchild 这三行数据是怎样算出来的。。。
作者&投稿:少空 (若有异议请与网页底部的电邮联系)
首先哈夫曼的构造你应该清楚:
找权值最小的两个结点。
新生成一个结点,把两个结点的总和计入这个结点中,且这两个结点是新结点的左子右子。
依次类推,直到只剩最后一个结点没有的双亲(即你上面那道题parent里面的0)。
那么这道题就是用了静态链表作为存储结构,之所以这样就是因为哈夫曼树的最终目的是要取得前缀编码,因此需要回溯,遍历等过程,用链表就必须设计递归会很麻烦。下面就说下怎么做:
找最小两个权值。那么第一次就应该是下标为1的权值3、下标为5的2,他们的和为5,那么就将这个5追加到目前的表尾(也就是权值11后面),那么对于weight部分就完成了。
修改双亲的左右子下标:那么现在权值为5的新结点的左右子的下标就应该分别是之前说到的5还有1了,那么下标为8的这一行就已经完毕了。
修改左右子的双亲下标:最后还差的就是把左右子的双亲下标都修改成5。
以此类推。(你可以在演算的途中把已经构造了的权值划掉,比如刚才的3和2就不参与之后的构造过程了,但是新生成的5是要参与的哦~)
厍符健胃: 代码这样理解:LNode *p=h; // p指针开始时指向头结点 while(p->next!=r) p=p->next; // 这个时候的r应该是最后一个结点指针,这里判断当前指针的下一指针是否是最后指针,是就退出循环,循环退出后,那么当前指针p应该是指向倒数第二个结点.p->next=NULL; // 因为最后结点r要删除,倒数第二结点p将变成新的最后结点,最后结点的特征就是没有下一结点,所有这里设置一下.free(r); // 把原来的最后结点内存释放掉 r=p; // 设置新的最后结点为倒数第二结点p
安乡县18881006983: 初学数据结构,请问q:=p↑.link;是什么意思? - ?
厍符健胃: q就是把p的下一个结点记录下来,p↑.link就是p指向的下一个结点,q↑.link就是q指向的下一个结点,所以在经过p↑.link:=q↑.link;操作,p指向的下一个结点就变成了它原来指向的下一个结点的下一个结点,所以就从链表中删掉了q结点.
安乡县18881006983: matlab初学,在没有上下文的情况下,我定义par.a =1;par.b=2;这样就自动生成par的数据结构了么? - ?
厍符健胃: 不是的,一定要用par.a或这par.b来引用之前定义的这两个参数
安乡县18881006983: 请问怎么在Proe的野火版里面把PAR文件转换为CAD的DWG文件 - ?
厍符健胃: 1.将pro/e的工程图文件输出成AutoCAD的*.dwg、*.dxf格式----能,方法是在pro/e的工程图中File>SaveaCopy>选择相应的DXF或DWG格式.2.在pro/e的草绘器中输出autoCAD文件----不能3.将AutoCAD格式的文件输入到pro/e工程图文件中----能,...
安乡县18881006983: 请问.par文件用什么程序打开啊?ACAD好像不行.. - ?
厍符健胃: *.par为交换文件 主要是Windows环境下的文件名绝大多数DOS文件名后缀在Windows下继续有效,但Windows本身也引出了许多种崭新的后缀名,如:*.drv为设备驱动程序(Driver)、*.fon和*.fot都是字库文件、*.grp为分组文件(Group)、*....
安乡县18881006983: 数据结构关于次优二叉树的问题,请问第二个P如何求? - ?
厍符健胃: 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大...
安乡县18881006983: 请问:严蔚敏数据结构第二章线性表中的LocateElem(L,e,compare())操作怎样理解? - ?
厍符健胃: LocateElem(L,e,compare()) 是这样的,L是一个线性表,e应该一个数据元素,compare()比较函数,意思是,查看e元素在L里面的存储位置,并返回回来
安乡县18881006983: fortran 如何输出派生数据类型任意成员的值? - ?
厍符健胃: 我想到的方法是让每个参数跟名字对应 type time real::t(4) real::name(4) end type 给t赋值的时候同时给对应的name赋值,然后就是循环了 call getarg(1,par) do I=1,4 if(trim(adjustl(par)).eq.trim(adjustl(time%name(i)))exit enddo write(",")time%t(i) 语法忽略
安乡县18881006983: 有一道数据结构题,请问大家. - ?
厍符健胃: void LGet_next(LString &T)//链串上的get_next算法 { p=T->succ;p->next=T;q=T; while(p->succ) { if(q==T||p->data==q->data) { p=p->succ;q=q->succ; p->next=q; } else q=q->next; }//while }//LGet_next 此乃某答案