您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 基于C的windows窗体中二叉树的绘制和哈夫曼编码的编制问题
1二叉树的绘制及哈夫曼树字符串的替换编程思路搜索二叉树:2二叉树的绘制:绘图代码://绘制二叉树publicvoidpaixu(){提取值得个数intnumofall=dt.Rows.Count;//声明标签数组存放节点Label[]L=newLabel[numofall];;inthigh=0;for(inti=0;inumofall;i++){//给标签赋值intvalofcell0,valofcell1,n;valofcell0=Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value.ToString());valofcell1=Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value.ToString());L[i]=newLabel();L[i].BorderStyle=System.Windows.Forms.BorderStyle.FixedSingle;//标签加框L[i].Text=valofcell0+,+valofcell1;stringb=a.WriteOut(valofcell0)+valofcell0;string[]data=b.Replace(-,-).Split('-');n=data.Count();//获取树高度if(nhigh)3{high=n;}}//给定各点的坐标intgc=Convert.ToInt32(Math.Pow(2,high))*20,gt=38;Form10f=newForm10();L[0].Location=newPoint(gc,gt);//给定根节点f.Controls.Add(L[0]);ShapeContainercan=newShapeContainer();for(inti=1;inumofall;i++){intvalofcell0,n,x,y;valofcell0=Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value.ToString());stringb=a.WriteOut(valofcell0)+valofcell0;string[]data=b.Replace(-,-).Split('-');n=data.Count();x=gc;y=gt;intj;for(j=0;jn-1;j++){if(Convert.ToInt32(data[j])Convert.ToInt32(data[j+1])){x=x+Convert.ToInt32(Math.Pow(2,high-j-1))*20;y+=50;}else{x=x-Convert.ToInt32(Math.Pow(2,high-j-1))*20;y+=50;}}L[i].Location=newPoint(x,y);//绘制直线LineShapeline=newLineShape();intxx,yy;if(Convert.ToInt32(data[j-1])Convert.ToInt32(data[j])){xx=x-Convert.ToInt32(Math.Pow(2,high-j))*20;yy=y-50;4}else{xx=x+Convert.ToInt32(Math.Pow(2,high-j))*20;yy=y-50;}intlenx=L[i].Right-L[i].Left;intleny=L[i].Bottom-L[i].Top;line.StartPoint=newPoint(xx+lenx/2,yy+leny);line.EndPoint=newPoint(x+lenx/2,y);f.Controls.Add(L[i]);can.Parent=f;line.Parent=can;}f.Show();}编程思路:可视化图形的建立:该方法采用lable和lineshape控件在窗体中显示的方法绘图,lable与lineshape采取动态建立的方法在窗体中添加。节点的定位:在搜索二叉树的程序中,我们可以得到搜索出某一个值得遍历路径如图中所示,这一串返回值的每一个值反映出对应层的值,将数字两两逐个比较,就可以将所求点的横坐标的值左移或者右移。以上图上面显示插入“144”节点为例:定义其坐标(x,y)将调用查询函数返回的字符串拆分为“465”,“111”,“167”“144”则比较“465”和“111”则由465111,x往左移动到“111”的位置,y下移一层同理比较“111”和“167”,由111167,x再右移到“167”的位置,y下移一层以此类推故可定义出各点位置为了保证节点不重,在定义各层的节点之间的距离时,是按照当层间距是下层的两倍间5距来定位的。同理找到各个节点间的线的坐标。哈夫曼树替换:窗体截图:代码:privatevoidbutton1_Click(objectsender,EventArgse){//获取每种字母的个数6int[,]charnum=newint[26,2];stringline=textBox1.Text.ToLower();intx=0;for(inti=0;i26;i++){intn=0;for(intj=0;jline.Length;j++){if(line[j]==Convert.ToChar(i+97)){n++;}}if(n!=0){charnum[x,1]=i+97;charnum[x,0]=n;x++;}}//建立哈夫曼树HuffmanTreec=newHuffmanTree(x);c.Create(charnum);//输出搜素结果textBox2.Text=字母\t+数量\t+位置编码?\r\n;string[]af=newstring[x];for(inti=0;ix;i++){textBox2.Text+=Convert.ToChar(charnum[i,1])+\t+charnum[i,0]+\t+c.Putout(charnum[i,1])+\r\n;af[i]=c.Putout(charnum[i,1]);}//替换字符串textBox3.Text=;for(intj=0;jline.Length;j++){for(inti=0;ix;i++){if(line[j]==Convert.ToChar(charnum[i,1])){textBox3.Text+=af[i];}}7}}//HuffmanTree.中增加的方法定义//搜寻所查询的节点publicintsearchnode(intk){for(inti=0;iLeafNum;i++){if(data[i].Type==k){returni;}}return0;}//输出查找路径publicstringPutout(intk){stringpo1=;intloc=searchnode(k);for(inti=0;data[loc].Parent!=-1;i++){if(data[data[loc].Parent].LChild==loc){po1+=0;}elseif(data[data[loc].Parent].RChild==loc){po1+=1;}loc=data[loc].Parent;}//po1+=1;char[]po2=newchar[po1.Length];for(inti=0;ipo1.Length;i++){po2[i]=po1[po1.Length-i-1];}stringx=newstring(po2);returnx;}8//HNode.中增加属性//标记值属性值publicintType{get{returntype;}set{type=value;}}编程思路:核心问题是遍历并找到所需节点的位置,调用searchnode()先找到所找节点的位置loc,然后往上查找,如果当前节点的父节点的左节点等于当前节点,则返回0,否则返回1,最后将返回的字符串倒序输出
本文标题:基于C的windows窗体中二叉树的绘制和哈夫曼编码的编制问题
链接地址:https://www.777doc.com/doc-2569026 .html