You are on page 1of 9

BO CO Ngi thc hin: 1. L Thu H 2. Phm Th Thanh Tn 3. Trng Th Hng Thy I.

Gii thut s-playtree (xin tham kho thm trong bo co v splaytree ca nhm) II. Xy dng chng trnh 1. D liu u vo v m t cy Thng qua gii thut v splaytree, v hng xy dng chng trnh, nhm xc nh u vo v d liu ca gii thut nh sau: - Cc nt c m t trn mt lp: - D liu (value, cost) ca mi nt l mt s nguyn - Mi nt gm mt con tr tri, phi v cha - Lp (class) Node nh ngha nt ca cy nh sau:

Trong : *) Cc trng d liu (Fields), c s dng ni b trong lp Node: - cost: cha gi tr ca nt, c gi tr nm trong min s nguyn (int16). - father: l con tr dng tr ti nt cha ca mt nt trong cy; father c kiu l Node - left: l con tr tr ti nt con tri ca mt nt trong cy; left c kiu l Node 1

- right: l con tr tr ti nt con phi ca mt nt trong cy; right c kim l Node *) Cc thuc tnh (Properties), c kiu tr v cng kiu lp Node: - Cost: Dng t, ly gi tr ca trng cost. - Father: Dng t, ly nt cha tng ng vi mt nt trong cy. Vi nt gc, trng father l null. Left: Dng t, ly nt con tri tng ng vi mt nt trong cy. Nu mt nt khng c con tri, trng left c gi tr null, thuc tnh tr v gi tr null. Right: Dng t, ly nt con phi tng ng vi mt nt trong cy, tng t nt con tri. *) Phng thc ca lp: Gm 2 constructor : Node(int cost) v Node(int cost, int type, Node father) Cy splay c m t trong qu trnh xy dng nh sau:
null Xc nh gi tr cho father l null tng ng vi nt gc ca cy

Root (tree)
link father link father Link left link right

Left

Right

null

null

null

null

2. Cc modul chc nng Modul chc nng thc hin cc thao tc ca thut ton c m t bng s sau:

Trong , cc trng root, tree, tree22 c kiu Node c s dng lu tr cy trong qu trnh thao tc. Cc phng thc s dng trong modul: a) Phng thc Tch cy Gii thut: - Tm nt cn tch - Chuyn nt v gc - Gn tree2 = nhnh phi ca cy - t gi tr ca nt con phi ca gc l null M chng trnh: Node node = Find(root.Left, k);//Tim nut can tach Focus(node);//Chuyen ve goc Node tree2 = null; tree2 = root.Left.Right; //tach tree2 if (rab1.Checked == true) { root.Left.Right = null; } else { root.Left = tree2; tree2.Father = root; tree2.Type = -1; } b. Find (tm kim) 3

*) Gii thut: B1- So snh gi tr cn tm vi nt hin hnh (bt u t gc) B2- Nu gi tr trng nhau, tr v nt hin ti => B5 B3- Nu gi tr ca nt < gi tr cn tm, B3.1 nu nt con phi bng null => B5 B3.2 duyt nt con phi, quay v B1 B4- Nu gi tr ca nt > gi tr cn tm B4.1 nu nt con tri bng null => B5 B4.2 duyt nt con tri, quay v B1 B5- Kt thc B5.1 Nu tm thy, Quay nt tm v gc B5.2 Nu khng tm thy tr v gi tr null *) M chng trnh - u vo ca modul - node: nt hin hnh ca cy - value: gi tr cn tm - u ra: nt tm tng ng hoc null. private Node Find(Node node, int value) { if (node.Cost == value) return node; else { if (node.Cost < value) { if (node.Right == null) return node; else return Find(node.Right, value); } else { if (node.Left == null) return node; else return Find(node.Left, value); } } } c. Delete (xa) *) Gii thut: *) M chng trnh - u vo: Cy splaytree, gi tr cn xa (hoc nt cn xa) - u ra: Cy splaytree xa mt nt private void BtnDelete_Click(object sender, EventArgs e) 4

{ int k = int.MaxValue; try { k = Convert.ToInt16(txtValue.Text); } catch { MessageBox.Show("Gi tr tm kim khng hp l"); txtValue.Focus(); } if (k < int.MaxValue) { Node node = Find(root.Left, k); Focus(node); tree = root.Left; Node nodeLeft = new Node(); Node nodeRight = new Node(); if(tree.Left != null) nodeLeft = tree.Left; else nodeLeft = null; if (tree.Right != null) nodeRight = tree.Right; else nodeRight = null; if (nodeLeft != null) { root.Left = nodeLeft; nodeLeft.Type = -1; nodeLeft.Father = root; Node kk = FindMax(nodeLeft); Focus(kk); nodeRight.Father = root.Left; root.Left.Right = nodeRight; nodeRight.Type = 1; } else { root.Left = nodeRight; nodeRight.Father = root; nodeRight.Type = -1; } } } 5

d. Tch cy *) Gii thut *) M chng trnh - u vo: Cy splaytree (tree) - u ra: Cy splaytree (tree, tree2) private void btnSplit_Click(object sender, EventArgs e) { int k = int.MaxValue; try { k = Convert.ToInt16(txtValue.Text); } catch { MessageBox.Show("Gi tr tm kim khng hp l"); txtValue.Focus(); } if (k < int.MaxValue) { Node node = Find(root.Left, k);//Tim nut can tach Focus(node);//Chuyen ve goc Node tree2 = null; tree2 = root.Left.Right; //tach tree2 if (rab1.Checked == true) { root.Left.Right = null; } else { root.Left = tree2; tree2.Father = root; tree2.Type = -1; } } } e. Xoay cy (Rotare splaytree) *) Gii thut *) M chng trnh - u vo: Cy splaytree - u ra: Cy splaytree private void Focus(Node k) 6

{ while (k.Father != root) // Xoay n khi k v gc { if (k.Father == root.Left) MoveNode(k); // Zig else { if (k.Type == k.Father.Type) // Zig Zig { MoveNode(k.Father); MoveNode(k); } else //Zig-Zag { MoveNode(k); MoveNode(k); } } } } Trong , th tc MoveNode(node s) c s dng chuyn mt nt vi nt cha ca n. - u vo: nt cn xoay - u ra: Cy ban u c xoay mt cp ti v tr ca nt hin ti private void MoveNode(Node s) { Node f = s.Father; // f l nt cha ca s Node g = f.Father; // g l nt cha ca f, ng ca s if (s.Type == -1) // s l con tri { if (s.Right != null) { s.Right.Father = f; s.Right.Type = -1; f.Left = s.Right; } else f.Left = null; if (f.Type == -1) { s.Type = -1; g.Left = s; 7

} else { s.Type = 1; g.Right = s; } s.Father = g; s.Right = f; f.Type = 1; f.Father = s; } else // s l con phi { if (s.Left != null) { s.Left.Father = f; s.Left.Type = 1; f.Right = s.Left; } else f.Right = null; ; if (f.Type == -1) { s.Type = -1; g.Left = s; } else { s.Type = 1; g.Right = s; } s.Father = g; s.Left = f; f.Type = -1; f.Father = s; } } 3. Hn ch v hng khc phc 8

V cn cc vn chuyn mn v hn ch v s dng ngn ng nn trong qu trnh xy dng chng trnh nhm ca em vn cn nhiu thiu st v hn ch, c bit trong qu trnh ti u m chng trnh v s dng b nh cng nh vn dng bi ton vo thc t.

You might also like