Hàng đ i (queue) có các thu c tính c c b : • M ng các giá tr trong hàng đ i Các thao tác v i hàng đ i:
• Thêm vào m t nút vào cu i hàng đ i • L y ra m t nút t đ u hàng đ i Ch ng trình 5.3 cài đ t l p hàng đ i.
Ch ng trình 5.3
package vidu.chuong5; public class MyQueu{
private Node[] values;
/* Các ph ng th c kh i d ng */ public MyQueu(){}
public MyQueu(Node[] values){ this.values = values; }
/* Ph ng th c l y ra m t node t đ u queu */ public Node remove(){
Node result = null;
if((values != null)&&(values.length > 0)){ result = values[0];
// Lo i b node đ u hàng đ i
Node[] tmpNode = new Node[values.length - 1]; for(int i=0; i<values.length – 1; i++)
tmpNode[i] = values[i+1]; this.values = tmpNode;
}
return result; }
/* Ph ng th c thêm m t node vào cu i queu */ public void insert(Node node){
if(values == null){ // Hàng đ i đang r ng values = new Node[1];
values[0] = node;
}else{ // Hàng đ i đã có d li u
Node[] tmpNode = new Node[values.length + 1]; for(int i=0; i<values.length; i++)
tmpNode[i] = values[i]; tmpNode[values.length] = node; this.values = tmpNode; } } } 5.4 DANH SÁCH LIÊN K T
N i dung ph n này t p trung cài đ t hai lo i danh sách liên k t c b n: • Danh sách liên k t đ n
• Danh sách liên k t kép
5.4.1 Danh sách liên k t đ n
nh ngh a m t nút c a danh sách liên k t đ n
M t nút c a danh sách liên k t đ n bao g m:
• Giá tr c a nút, có d ng là m t đ i t ng ki u Node đã đ c đnh ngh a trong ch ng trình 5.2a
• Nút ti p theo c a nút đó.
M t nút c a danh sách liên k t đ n đ c cài đ t trong ch ng trình 5.4a.
Ch ng trình 5.4a
package vidu.chuong5; public class SimpleNode{
private Node value; // Giá tr c a node là m t đ i t ng ki u Node private SimpleNode next; // Node ti p theo c a danh sách liên k t
/* Các ph ng th c kh i d ng */ public SimpleNode(){
value = new Node(); next = null;
}
public SimpleNode(Node value){ this.value = value;
next = null; }
/* Ph ng th c truy nh p thu c tính value */ public Node getValue(){
return value; }
public void setValue(Node value){ this.value = value;
}
/* Ph ng th c truy nh p thu c tính next */ public SimpleNode getNext(){
return next; }
public void setNext(SimpleNode next){ this.next = next;
} }
nh ngh a đnh tiêu đ c a danh sách liên k t đ n
nh tiêu đ c a danh sách liên k t đ n là m t đ i t ng khác v i m t nút thông th ng c a danh sách. i t ng này l u các thông tin:
• Ch đ n nút th c s đ u tiên c a danh sách • Ch đ n nút cu i cùng c a danh sách
• L u gi s l ng nút th c s trong danh sách. Ch ng trình 5.4b cài đ t l p đnh tiêu đ c a danh sách.
Ch ng trình 5.4b
package vidu.chuong5;
public class HeaderSimpleNode{ private int nodeNumber; private SimpleNode header; private SimpleNode tailer;
/* Ph ng th c kh i d ng */ public HeaderSimpleNode(){ nodeNumber = 0; header = null; tailer = null; }
/* Ph ng th c truy nh p thu c tính nodeNumber */ public int getNodeNumber(){
return nodeNumber; }
public void setNodeNumber(int nodeNumber){ this.nodeNumber = nodeNumber;
}
/* Ph ng th c truy nh p thu c tính header */ public SimpleNode getHeader(){
return header; }
public void setHeader(SimpleNode header){ this.header = header;
}
/* Ph ng th c truy nh p thu c tính tailer */ public SimpleNode getTailer(){
return tailer; }
public void setTailer(SimpleNode tailer){ this.tailer = tailer;
} }
Cài đ t danh sách liên k t đ n
Danh sách liên k t đ n có thu c tính c c b là m t đ i t ng ki u HeaderSimpleNode. Và có các thao tác chính:
• Thêm m t ph n t vào m t v trí b t kì: n u v trí nh h n 0, thêm vào đ u danh sách. N u v trí l n h n đ dài danh sách, thêm vào cu i. Tr ng h p còn l i, chèn vào danh sách m t cách bình th ng.
• Lo i b m t ph n t v trí b t kì: Ch lo i b khi v trí ch ra n m trong ph m vi đ dài danh sách. Ph ng th c này tr v nút b lo i b , có ki u SimpleNode.
• Duy t toàn b danh sách: Tr v giá tr c a t t c các ph n t có trong danh sách. Giá tr tr v là m t m ng các ph n t giá tr có ki u Node.
Ch ng trình 5.4c cài đ t l p danh sách liên k t đ n.
Ch ng trình 5.4c
package vidu.chuong5; public class SimpleList{
private HeaderSimpleNode myList;
/* Các ph ng th c kh i d ng */ public SimpleList(){
myList = new HeaderSimpleNode(); }
/* Ph ng th c chèn thêm m t node vào v trí @position */ public void insert(Node value, int position){
// T o m t node m i
SimpleNode newNode = new SimpleNode(value); if(position <= 0){ // Chèn vào đ u
newNode.setNext(myList.getHeader()); myList.setHeader(newNode);
if(myList.getNodeNumber() == 0) // Danh sách ban đ u r ng myList.setTailer(newNode);
}else if(position >= myList.getNodeNumber()){ // Chèn vào cu i if(myList.getNodeNumber() == 0){ // Danh sách ban đ u r ng myList.setHeader(newNode);
myList.setTailer(newNode); }else{ // Danh sách không r ng
myList.getTailer().setNext(newNode); myList.setTailer(newNode);
}
}else{ // Chèn vào gi a int index = 0;
SimpleNode prev = null;
SimpleNode current = myList.getHeader(); while(index < position){ index++; prev = current; current = current.getNext(); } newNode.setNext(current); prev.setNext(newNode); } // C p nh t s l ng node c a danh sách myList.setNodeNumber(myList.getNodeNumber() + 1); } /* Ph ng th c lo i b m t node v trí @position */ public SimpleNode remove(int position){
if((myList.getNodeNumber() == 0)||
(position < 0)||(position >= myList.getNodeNumber())) return null;
SimpleNode result = null;
if(position == 0){ // Lo i ph n t đ u result = myList.getHeader();
if(myList.getNodeNumber() == 1) // Danh sách ch có 1 ph n t myList.setTailer(null);
}else if(position==myList.getNodeNumber()-1){ // Lo i ph n t cu i result = myList.getTailer();
SimpleNode current = myList.getHeader();
while(!current.getNext().equals(myList.getTailer())) current = current.getNext(); current.setNext(null); myList.setTailer(current); }else{ // Lo i ph n t n m gi a danh sách int index = 0;
SimpleNode prev = null;
SimpleNode current = myList.getHeader(); while(index < position){ index++; prev = current; current = current.getNext(); } prev.setNext(current.getNext()); result = current; } // C p nh t s l ng node c a danh sách myList.setNodeNumber(myList.getNodeNumber() - 1); result.setNext(null); return result; }
/* Ph ng th c duy t toàn b danh sách */ public Node[] travese(){
// Danh sách r ng
if(myList.getNodeNumber() == 0) return null;
// Danh sách không r ng
Node[] result = new Node[myList.getNodeNumber()]; SimpleNode current = myList.getHeader();
int index = 0;
while(current != null){
result[index] = current.getValue(); index++;
} return result; } } 5.4.2 Danh sách liên k t kép nh ngh a m t nút c a danh sách liên k t kép
M t nút c a danh sách liên k t kép bao g m:
• Giá tr c a nút, có d ng là m t đ i t ng ki u Node đã đ c đnh ngh a trong ch ng trình 5.2a
• Nút ti p theo c a nút đó. • Nút tr c c a nút đó.
M t nút c a danh sách liên k t kép đ c cài đ t trong ch ng trình 5.5a.
Ch ng trình 5.5a
package vidu.chuong5; public class DoubleNode{
private Node value; private DoubleNode prev; private DoubleNode next;
/* Các ph ng th c kh i d ng */ public DoubleNode(){
value = new Node(); prev = null;
next = null; }
public DoubleNode(Node value){ this.value = value;
prev = null; next = null; }
/* Ph ng th c truy nh p thu c tính value */ public Node getValue(){
return value; }
public void setValue(Node value){ this.value = value;
}
public DoubleNode getNext(){ return next;
}
public void setNext(DoubleNode next){ this.next = next;
}
/* Ph ng th c truy nh p thu c tính prev */ public DoubleNode getPrev(){
return prev; }
public void setPrev(DoubleNode prev){ this.prev = prev;
} }
nh ngh a đnh tiêu đ c a danh sách liên k t kép
nh tiêu đ c a danh sách liên k t đ n là m t đ i t ng khác v i m t nút thông th ng c a danh sách. i t ng này l u các thông tin:
• Ch đ n nút th c s đ u tiên c a danh sách • Ch đ n nút cu i cùng c a danh sách
• L u gi s l ng nút th c s trong danh sách. Ch ng trình 5.5b cài đ t l p đnh tiêu đ c a danh sách.
Ch ng trình 5.5b
package vidu.chuong5;
public class HeaderDoubleNode{ private int nodeNumber; private DoubleNode header; private DoubleNode tailer;
/* Ph ng th c kh i d ng */ public HeaderDoubleNode(){ nodeNumber = 0; header = null; tailer = null; }
/* Ph ng th c truy nh p thu c tính nodeNumber */ public int getNodeNumber(){
}
public void setNodeNumber(int nodeNumber){ this.nodeNumber = nodeNumber;
}
/* Ph ng th c truy nh p thu c tính header */ public DoubleNode getHeader(){
return header; }
public void setHeader(DoubleNode header){ this.header = header;
}
/* Ph ng th c truy nh p thu c tính tailer */ public DoubleNode getTailer(){
return tailer; }
public void setTailer(DoubleNode tailer){ this.tailer = tailer;
} }
Cài đ t danh sách liên k t kép
Danh sách liên k t kép có thu c tính c c b là m đ i t ng ki u HeaderDoubleNode. Và có các thao tác chính:
• Thêm m t ph n t vào m t v trí b t kì: n u v trí nh h n 0, thêm vào đ u danh sách. N u v trí l n h n đ dài danh sách, thêm vào cu i. Tr ng h p còn l i, chèn vào danh sách m t cách bình th ng.
• Lo i b m t ph n t v trí b t kì: Ch lo i b khi v trí ch ra n m trong ph m vi đ dài danh sách. Ph ng th c này tr v nút b lo i b , có ki u DoubleNode.
• Duy t toàn b danh sách: Tr v giá tr c a t t c các ph n t có trong danh sách. Giá tr tr v là m t m ng các ph n t giá tr có ki u Node.
Ch ng trình 5.5c cài đ t l p danh sách liên k t kép.
Ch ng trình 5.5c
package vidu.chuong5; public class DoubleList{
private HeaderDoubleNode myList;
/* Các ph ng th c kh i d ng */ public DoubleList(){
myList = new HeaderDoubleNode(); }
/* Ph ng th c chèn thêm m t node vào v trí @position */ public void insert(Node value, int position){
// T o m t node m i
DoubleNode newNode = new DoubleNode(value); if(position <= 0){ // Chèn vào đ u
newNode.setNext(myList.getHeader()); myList.getHeader().setPrev(newNode); myList.setHeader(newNode);
if(myList.getNodeNumber() == 0) // Danh sách ban đ u r ng myList.setTailer(newNode);
}else if(position >= myList.getNodeNumber()){ // Chèn vào cu i if(myList.getNodeNumber() == 0){ // Danh sách ban đ u r ng myList.setHeader(newNode);
myList.setTailer(newNode); }else{ // Danh sách không r ng
newNode.setPrev(myList.getTailer()); myList.getTailer().setNext(newNode); myList.setTailer(newNode); } }else{ // Chèn vào gi a int index = 0;
DoubleNode current = myList.getHeader(); while(index < position){ index++; current = current.getNext(); } newNode.setNext(current); newNode.setPrev(current.getPrev()); current.getPrev().setNext(newNode); current.setPrev(newNode); } // C p nh t s l ng node c a danh sách myList.setNodeNumber(myList.getNodeNumber() + 1); } /* Ph ng th c lo i b m t node v trí @position */ public DoubleNode remove(int position){
if((myList.getNodeNumber() == 0)||
(position < 0)||(position >= myList.getNodeNumber())) return null;
DoubleNode result = null; if(position == 0){ // Lo i ph n t đ u result = myList.getHeader(); myList.setHeader(myList.getHeader().getNext()); if(myList.getHeader() != null) myList.getHeader().setPrev(null); if(myList.getNodeNumber() == 1) // Danh sách ch có 1 ph n t myList.setTailer(null); }else if(position==myList.getNodeNumber()-1){ // Lo i ph n t cu i result = myList.getTailer(); myList.setTailer(myList.getTailer().getPrev()); myList.getTailer().setNext(null); }else{ // Lo i ph n t n m gi a danh sách int index = 0;
DoubleNode current = myList.getHeader(); while(index < position){ index++; current = current.getNext(); } current.getPrev().setNext(current.getNext()); current.getNext().setPrev(current.getPrev()); result = current; } // C p nh t s l ng node c a danh sách myList.setNodeNumber(myList.getNodeNumber() - 1); result.setPrev(null); result.setNext(null); return result; }
/* Ph ng th c duy t toàn b danh sách */ public Node[] travese(){
// Danh sách r ng
if(myList.getNodeNumber() == 0) return null;
// Danh sách không r ng
Node[] result = new Node[myList.getNodeNumber()]; DoubleNode current = myList.getHeader();
int index = 0; while(current != null){ result[index] = current.getValue(); index++; current = current.getNext(); } return result; } } 5.5 CÂY NH PHÂN
Cài đ t nút c a cây nh phân
M t nút c a cây nh phân có các thu c tính sau: • Giá tr c a nút là m t đ i t ng ki u Node • Ch đ n nút con bên trái c a nó.
• Ch đ n nút con bên ph i c a nó.
Ch ng trình 5.6a cài đ t m t nút c a cây nh phân.
Ch ng trình 5.6a
package vidu.chuong5;
public class BinaryTreeNode{ private Node value;
private BinaryTreeNode left; private BinaryTreeNode right;
/* Các ph ng th c kh i d ng */ public BinaryTreeNode(){
value = new Node(); left = null;
right = null; }
public BinaryTreeNode(Node value){ this.value = value;
left = null; right = null; }
/* Ph ng th c truy nh p thu c tính value */ public Node getValue(){
return value; }
public void setValue(Node value){ this.value = value;
}
/* Ph ng th c truy nh p thu c tính left */ public BinaryTreeNode getLeft(){
return left; }
public void setLeft(BinaryTreeNode left){ this.left = left;
}
/* Ph ng th c truy nh p thu c tính right */ public BinaryTreeNode getRight(){
return right; }
public void setRight(BinaryTreeNode right){ this.right = right;
} }
Cài đ t cây nh phân
V i cây nh phân, ta ch c n l u gi m t bi n c c b là nút g c c a cây. Khi đó, ta c n đ n các thao tác c b n trên cây nh phân nh sau:
• Tìm m t nút có giá tr (ho c là khoá) xác đnh • Thêm nút con trái c a m t nút
• Thêm nút con ph i c a m t nút • Xoá nút con trái c a m t nút • Xoá nút con ph i c a m t nút • Duy t cây theo th t tr c • Duy t cây theo th t gi a • Duy t cây theo th t sau
Ch ng trình 5.6b cài đ t l p cây nh phân.
Ch ng trình 5.6b
package vidu.chuong5; public class BinaryTree{
private BinaryTreeNode root;
public BinaryTree(){ root = null;
}
public BinaryTree(Node value){
root = new BinaryTreeNode(value); }
/* Ph ng th c tr v node có giá tr @value */ public BinaryTreeNode getNode(Node value){
return searchNode(root, value); }
/* Ph ng th c tìm ki m đ qui m t node có giá tr @value trên m t cây con có g c là @treeNode */
private BinaryTreeNode searchNode(BinaryTreeNode treeNode, Node value){
if(treeNode.getValue().equals(value)) return treeNode;
if(treeNode == null) return null;
BinaryTreeNode result = null; // Tìm trên nhánh con bên trái
result = searchNode(treeNode.getLeft(), value); // Tìm trên nhánh con bên ph i
if(result == null)
result = searchNode(treeNode.getRight(), value); return result;
}
/* Ph ng th c thêm node con bên trái c a node @treeNode */ public boolean insertLeft(BinaryTreeNode treeNode, Node value){
if((treeNode == null)||(treeNode.getLeft() != null)) return false;
BinaryTreeNode newNode = new BinaryTreeNode(value); treeNode.setLeft(newNode);
return true; }
/* Ph ng th c thêm node con bên ph i c a node @treeNode */ public boolean insertRight(BinaryTreeNode treeNode, Node value){
if((treeNode == null)||(treeNode.getRight() != null)) return false;
treeNode.setRight(newNode); return true;
}
/* Ph ng th c xóa node con bên trái c a node @treeNode */ public boolean removeLeft(BinaryTreeNode treeNode){
// Node hi n t i r ng if(treeNode == null)
return false;
// Node con trái không ph i là node lá if((treeNode.getLeft() != null)&& ((treeNode.getLeft().getLeft() != null)|| (treeNode.getLeft().getRight() != null))) return false; treeNode.setLeft(null); return true; }
/* Ph ng th c xoá node con bên ph i c a node @treeNode */ public boolean removeRight(BinaryTreeNode treeNode){
// Node hi n t i r ng if(treeNode == null)
return false;
// Node con ph i không ph i là node lá if((treeNode.getRight() != null)&& ((treeNode.getRight().getLeft() != null)|| (treeNode.getRight().getRight() != null))) return false; treeNode.setRight(null); return true; }
/* Ph ng th c duy t cây theo th t tr c */ public Node[] preTravese(){
Node[] result = null; preOrder(root, result); return result;
}
/* Ph ng th c duy t cây con @treeNode theo th t tr c và k t qu tr v n m trong @result */
private void preOrder(BinaryTreeNode treeNode, Node[] result){ if(treeNode != null){
addNode(result, treeNode.getValue()); preOrder(treeNode.getLeft(), result); preOrder(treeNode.getRight(), result); }
}
/* Ph ng th c thêm m t @node vào cu i m t danh sách các @nodes*/ private void addNode(Node[] nodes, Node node){
if(nodes == null){// Danh sách ban đ u r ng nodes = new Node[1];
nodes[0] = node; return;
}
Node[] tmpNodes = new Node[nodes.length + 1]; for(int i=0; i<nodes.length; i++)
tmpNodes[i] = nodes[i]; tmpNodes[nodes.length] = node; nodes = tmpNodes;
}
/* Ph ng th c duy t cây theo th t gi a */ public Node[] inTravese(){
Node[] result = null; inOrder(root, result); return result;
}
/* Ph ng th c duy t cây con @treeNode theo th t gi a và k t qu tr v n m trong @result */
private void inOrder(BinaryTreeNode treeNode, Node[] result){