Node PARENTNode n,Tree T{if EMPTY_TREET || n>T.MaxNode-1 return NULL; else return T.Parent[n]; }... } while T.MaxNodeMAXLENGTH;printf"Nhap nhan cua nut goc ";... Cài đ t cây b ng con trC
Trang 1Ch ng 3: C u trúc cây
Trees
Trang 2̈ M i quan h cha con đ c bi u di n theo qui c nút cha
dòng trên nút con dòng d i và đ c n i b i m t
đ o n th ng
Trang 6̈ Nút không có h u du th c s
g i là nút lá (leaf)
̈ Nút không ph i là lá ta còn g i
là nút trung gian (interior)
̈ Cây con c a m t cây là m t
Trang 8Duy t cây
̈ Duy t cây là m t qui t c cho phép đ i qua l n l t t t
c các nút c a cây m i nút đ úng m t l n
̈ Danh sách li t kê các nút (tên nút/ giá tr ) theo th
t đ i qua g i là danh sách duy t cây
̈ Ba cách duy t cây quan tr ng:
̈ duy t ti n t (preorder),
̈ duy t trung t (inorder),
̈ duy t h u t (posorder).
Trang 13*
Trang 14Bi u th c ti n t - * a c b
Bi u th c trung t a * c – b
Bi u th c h u t a c * b
Trang 15-KI U D LI U TR U T NG
CÂY
̈ Hàm PARENT(n,T) cho nút cha c a nút n trên cây T
̈ Hàm LEFTMOST_CHILD(n,T) cho nút con trái nh t c a nút n trên cây
T, n u n là lá thì hàm cho giá tr NULL
̈ Hàm RIGHT_SIBLING(n,T) cho nút anh em ru t ph i nút n trên cây T,
n u n không có anh em ru t ph i thì hàm cho giá tr NULL
̈ Hàm LABEL_NODE(n,T) cho nhãn t i nút n c a cây T
̈ Hàm ROOT(T) tr ra nút g c c a cây T N u Cây T r ng thì hàm tr v
NULL
̈ Hàm CREATEi(v,T1,T2, ,Ti),v i i=0 n, th t c t o cây m i có nút g c là
n đ c gán nhãn v và có i cây con T1, ,Ti
̈ N u n= 0 thì th t c t o cây m i ch g m có 1 nút đ n đ c là n có nhãn
v
̈ Hàm EMPTY_TREE(T) tr v true n u cây r ng, ng c l i nó tr v
false
Trang 16̈ Các nút con cùng m t nút cha
đ c đ ánh s l n l t t trái sang ph i
Trang 1787
65
Maxnode
Maxlength
Trang 18Ví d khác
A
B
E D
C
G
J I
0
Trang 20Node PARENT(Node n,Tree T){
if (EMPTY_TREE(T) || (n>T.MaxNode-1))
return NULL;
else return T.Parent[n];
}
Trang 21Xác đ nh nhãn c a nút trên cây
DataType LABEL_NODE(Node n,Tree T){
if (!EMPTY_TREE(T) && (n<=T.MaxNode-1))
Trang 28} while ((T.MaxNode<1) || (T.MaxNode>MAXLENGTH));
printf("Nhap nhan cua nut goc ");
Trang 29̈ Ch ng trình chính đ th c hi n yêu c u đ bài nh sau:
Trang 30Bi u di n cây b ng danh sách các con
A B C D E F G J H I
8
Trang 31Bi u di n theo con trái nh t và anh em
ru t ph i
̈ Các c u trúc đã dùng đ mô t cây trên có m t s nh c
đ i m: không tr giúp phép t o m t cây l n t các cây nh h n, ngh a là ta khó có th cài đ t phép toán CREATEi
̈ Ch ng h n CREATE2(v,T1,T2) chúng ta ph i chép hai cây
T1, T2 vào m ng th ba r i thêm m t nút n có nhãn v và hai nút con là g c c a T1 và T2
̈ Ta thay th m ng các Header b ng m ng CELLSPACE ch a các b n ghi (struct) có ba tr ng Data, Leftmost_Child,
Right_Sibling
̈ Data gi nhãn c a nút,
̈ Leftmost_Child là m t con nháy ch đ n con trái nh t c a nút,
̈ Right_Sibling là con nháy ch đ n nút anh ru t ph i
̈ H n n a m ng này gi t t c các nút c a t t c các cây
Trang 32Các khai báo c n thi t là
Trang 33Parent Right_
Sibling
Leftmost_
Child
Data Ch
s
6
8
5 null
Null C
7
0
6
Null null
3 A
5 Root
3 null
Null E
4
5 7
1 B
3
8
2 Available
3 4
Null D
Trang 34Hàm CREATE2 t o cây m i t hai cây con
int CREATE2(DataType v, int T1, int T2){
// T1, T2 là hai con nháy tr t i hai nút g c c a hai cây con
// Hàm tr ra con nháy tr t i nút g c m i
//l y ô đ u danh sách available đ t o m t nút m i trên cây
int temp=Available ; //available nh là m t bi n toàn c c
Trang 35Leftmost_Child Data
Ch s
1
F
8
3 4
D
7
0
6
1 8
C
5 Root
3
E
4
1 5
7 B
3
6
2 Available
3 A
1
0
Trang 36Cài đ t cây b ng con tr
Các khai báo nh sau
typedef int DataType;
typedef struct Cell{
typedef Cell* Node;
typedef Node Tree;
Trang 37Node Create2(DataType v, Tree left, Tree right){
Trang 38CÂY NH PHÂN (BINARY TREES)
̈ Cây nh phân là cây r ng
̈ Ta qui c v nút con trái
bên trái nút cha và nút con
Trang 39Duy t cây
(Node-Left-Right): duy t nút g c, duy t
ti n t con trái r i duy t ti n
t con ph i.
(Left-Node-Right): duy t trung t con
trái r i đ n nút g c sau đó là
duy t trung t con ph i.
(Left-Right-Node): duy t h u t con trái
r i duy t h u t con ph i sau
đó là nút g c.
nút
left right
Trang 40HIDJEBKLFMGCA HIDJEBKLFMGCA
H u t :
HDIBJEAKFLCMG HDIBJEAKFLCGM
Trung t :
ABDHIEJCFKLGM ABDHIEJCFKLGM
Trang 41Cài đ t cây nh phân
typedef int DataType;
typedef struct Node{
Trang 42Xác đ nh con trái c a m t nút
Tree LEFTCHILD(Tree n){ //n co
kieu Node*, tuc la Tree
if (n!=NULL) return n->left;
else return NULL;
}
Xác đ nh con ph i c a m t nút
Tree RIGHTCHILD(Tree n){
if (n!=NULL) return n->right;
else return NULL;
if(EMPTY_TREE(T)) return 0;
else return 1 +NB_NODES(LEFTCHILD(T)) + NB_NODES(RIGHTCHILD(T)); }
T o cây m i t hai cây có s n Tree Create2(DataType v,Tree l,Tree r){
Tree N;
N=(Node*)malloc(sizeof(Node)); N->Data=v;
N->left=l;
N->right=r;
return N;
}
Trang 46̈ SO nut cua cay: 6
Tree T1 = Create2('D', NULL, NULL);
Tree T2 = Create2('E', NULL, NULL);
Tree T3 = Create2('F', NULL, NULL);
Trang 47thu c cây con bên trái và nh h n
khoá c a t t c các nút thu c cây
con bên ph i.
typedef <ki u d li u c a khoá> KeyType;
typedef struct Node{
15
35
37
Trang 48Tìm ki m 1 nút có khóa x
20
10
17 5
15
35
37
Tree Search (KeyType x,Tree Root){
if (Root==NULL) return NULL;
else if(Root->Key==x)
return Root;
else if (Root->Key<x)
return Search(x,Root->right);else
return Search(x,Root->left);}
Th i gian tìm ki m 1 nút : O(h), h là chi u cao cây
Trang 49Thêm m t khoá vào cây TKNP
void InsertNode(KeyType x,Tree& Root ){
15
35
37
Trang 5015
Trang 51else if (x > Root->Key) DeleteNode(x,Root->Right);
else if ((Root->Left==NULL) && (Root>Left==NULL) && (Root->Right==NULL)) Root=NULL;
else
if (Root->Left == NULL) Root = Root->Right;
else if (Root->Right==NULL) Root = Root->Left;
else Root->Key = DeleteMin(Root->Right);
}