SlideShare a Scribd company logo
Мод
Мод, графын ерөнхий зарчим. Тэдгээр дээр хийгдэх
үйлдлүүд. Модоор гүйх аргууд
Мод
 Мод нь шугаман биш өгөгдлийн бүтэц юм. Энэ өгөгдийн бүтцийн
зохион байгуулалт нь элементүүдийн шаталсан, нэгээс олон гэсэн
харьцаагаар тодорхойлогддог. Бидний өдөр тутмын амьдралд
модны хэрэглээ өдөр тутам тохиолдож байдаг. Жишээлбэл энд
ургийн бичгийг дурьдж болох юм.
 Мод нь ямар нэг нөхцлийг хангах тодорхой дүрмээр зохион
байгуулагдсан элементүүд болон тэдгээрийг холбсон
холбоосуудыг агуулдаг.
 Элементийн мэдээллийг хадгалах ердийн нэг обьект ба холбоос нь
хоѐр элементийн хоорондын харьцааг тодорхойлдог. Холбоосоор
холбогдсон модны дараалсан элементүүдийн жагсаалтыг зам гэнэ.
Модны бусад элементэд хүрэх зам нь давтагдашгүй тодорхойлох
боломжтой нэг элементийг модын язгуур үндэс элемент гэж
нэрлэдэг. Модыг графын онцгой нэг тохолдол гэж үзэж болно
Мод
 Модны холбоосуудад чиглэл тодорхойгүй бөгөөд холбоосуудын
чиглэлийг тухайн бодлогоос хамааран үндсэн элементээс доош
эсвэл үндсэн элементрүү гэсэн бүгд нэг чиглэлд хандсан мэтээр
авч үздэг. Модны үндсэн элементийг ихэвчлэн хамгийн дээр нь
зурдаг. Үндсэн элементээс ямар нэг У элементрүү хүрэх замд Х
элемент тохиолдож байвал У элементийг Х элементийн доор
байна гэж үзнэ.
 Модны элемент бүр дээрээ зөвхөн нэг элементтэй холбогдох ба
доороо хичнээн ч элемент агуулж болох ба тэдгээр элементүүдийг
тухайн элементийн дэд элемент гэнэ. Тухайн элементийн дэд
элементээс салаалсан элементийг дэд мод гэнэ.
 Модны элементүүд түвшингүүдэд хуваагдан байрладаг ба
элемент бүр тодорхой нэг түвшинд харьяалагдана. Эхний түвшин
буюу 0 түвшинд зөвхөн үндсэн элемент байна. Модны гүн буюу
өндөр нь модны түвшингийн тоогоор тодорхойлогдоно. Иймээс
модны өндөр нь хамгийн их түвшингийн утгаас нэгээр их байна.
Модны замын урт нь модон дахь бүх элементийн түвшингүүдийн
нийлбэрээр тодорхойлогдоно.
Мод
Root node
Leaf nodes
Interior nodes
Height
Root  no parent
Leaf  no child
Interior  non-leaf
Height  distance from root to leaf
Хоѐртын мод
 Хоѐртын мод нь модны нэг онцгой тохиолдлын нэг бөгөөд
элемент бүр нь хоѐроос илүүгүй дэд зангилаатай байдаг. Хэрэв
мод нэг ч элемент агуулаагүй бол хоосон мод буюу NULL мод
юмуу элемент гэж нэрлэнэ. Элементийн дэд 2 элементийг зүүн
дэд элемент, баруун дэд элемент гэж нэрэлдэг. Хоѐртын модны
элемент нь 1, 2 дэд элемент агуулж болно. Харин төгсгөлийн
элементүүд нь дэд элементүүдгүй бөгөөд 2 хоосон дэд модтой
байна.
Tree Binary Tree
Tree
Nodes
Each node can have 0 or more children
A node can have at most one parent
Binary tree
Tree with 0–2 children per node
Хоѐртын мод
 Модны хамгийн сүүлийн түвшингээс бусад түвшинд дотоод
элементээр гүйцэд дүүргэгдсэн бол дүүрэн хоёртын мод гэнэ.
Харин дотоод элементийг агуулах хамгийн сүүлийн түвшингийн
зөвхөн баруун талд зарим гадаад элемент байвал түүнийг
гүйцэд мод гэнэ
Модны шинж чанарууд:
Чанар 1.Модны ямар нэг 2 элементийг холбох ганц зам байна.
Аль ч хоѐр элементийг авч үзхэд ядаж нэг ерөнхий эх элемент
олдоно.
Чанар 2. N элемент бүхий тод N-1 холбоостой байна.
Энэ чанар нь үндсэн элементээс бусад бүх элемент нь зөвхөн
ганц эх элементд шууд холбогдоно гэдгээс мөрдөн гарна.
Чанар 3.N дотоод элемент бүхий хоёртын мод нь N+1 гадаад
элементтэй байна.
Энэ чанарыг индукц ашиглан батлья. Дотоод элементгүй буюу
хоосон мод нь нэг гадаад элементтэй байна. Энэ тохиолдолд N=0
байна. N>0 үед N дотоод элементтэй хоѐртын модны K дотоод
элемент нь зүүн дэд модонд, N-1-K дотоод элемент нь баруун дэд
модонд байна. Индукцын зарчмаар зүүн дэд модонд K+1 гадаад
элемент, баруун дэд модонд N-K гадаад элемент байдаг гэвэл
нийт (K+1)+(N-K)=N+1 гадаад элементтэй байна.
Модны шинж чанарууд:
Чанар 4. N дотоод элемент бүхий хоёртын модны гадаад
замын урт нь дотоод замын уртаас 2N-ээр илүү байдаг.
Аливаа хоѐртын мод нь нэг гадаад элемент агуулах хоосон
модноос эхлэн үүсдэг. Модонд шинээр нэг өгөгдөл нэмэх
процесс нь нэг гадаад элементийг хоѐр гадаад элемент бүхий
нэг дотоод элементээр сольдог. Хэрэв К түвшин дэх гадаад
элементийг сольвол уг модны дотоод замын урт нь К утгаар
нэмэгдэх ба харин гадаад замын урт нь К+2 уртаар (К
түвшинээс 1 гадаад элемент хасагдаж, хоѐр гадаад элемент
нь K+1 түвшинд орно) нэмэгдэнэ. Энэ процесс нь дотоод ба
гадаад замын урт тэгтэй тэнцүү байхаас эхлэх бөгөөд N алхам
бүрт дотоод замын уртаас 2-оос илүү утгаар нэмэгдэж байна.
Чанар 5. Хоёртын модны I түвшинд хамгийн ихдээ 2-ийн i
зэрэг элемент байна.
Чанар 6. n өндөртөй 2тын модны максимум зангилааны
тоо нь 2-ийн n зэргээс нэгийг хассантай тэнцүү
Чанар 7. n дотоод элемент бүхий дүүрэн 2тын модны өндөр
нь ойролцоогоор log 2 суурьтай n тэй тэнцүү.
Хоёртын мод байгуулах
 Хоѐртын модыг нэвтрүүлэх нэг арга бол түүний элементийг
өгөгдөл болон хоѐр (зүүн/баруун) холбоос агуулах өгөгдлийн
хийсвэр төрлөөр тодорхойлдог. Жишээ нь: илэрхийлэлд
оролцож байгаа үйлдлийн тэмдэгүүд нь хоѐр аргумент авдаг
бол үүнийг хоѐртын модоор илэрхийлж болно. Хэрэв олон
янзын үйлдэл оролцсон хүндэвтэр илэрхийлэл байвал модыг
арай өөр хэлбэрээр зохион байгуулах шаардлагатай.
 Гэвч бидний зорилго энгийн арифметик илэрхийллийг ашиглан
хоѐртын модыг байгуулах явдал юм.
 A*(((B+C)*(D*E))+F) илэрхийлэлд харгалзах хоѐртын мод: (Polish
тэмдэглэгээгээр хоѐртын мод үүсгэх болно. )
 Жишээ:
Хоёртын мод байгуулах
11 void insert(node ** tree, int val) {
12 node *temp = NULL;
13 if(!(*tree)) {
14 temp = (node *)malloc(sizeof(node));
15 temp->left = temp->right = NULL;
16 temp->data = val;
17 *tree = temp;
18 return;
19 }
20
21 if(val < (*tree)->data) {
22 insert(&(*tree)->left, val);
23 } else if(val > (*tree)->data) {
24 insert(&(*tree)->right, val);
25 }
26 }
Хоѐртын модны элемент нь BinTree загвар классаар тодорхойлогдох
бөгөөд өгөгдөл болон зүүн баруун салаануудыг заах заагчуудыг агуулж
байна. setr(), setl() гишүүн функцүүд нь тухайн элементийн баруун ба зүүн
дэд модыг холбож өгөх ба харин getr(), getl() гишүүн функцүүд нь тухайн
элементийн баруун ба зүүн дэд модыг буцаана.
[Lines 13-19] Check first if tree is empty, then
insert node as root.
[Line 21] Check if node value to be inserted is
lesser than root node value, then
a. [Line 22] Call insert() function recursively
while there is non-NULL left node
b. [Lines 13-19] When reached to leftmost
node as NULL, insert new node.
[Line 23] Check if node value to be inserted is
greater than root node value, then
a. [Line 24] Call insert() function recursively
while there is non-NULL right node
b. [Lines 13-19] When reached to rightmost
node as NULL, insert new node.
Хоёртын модоор гүйх
 Мод байгуулсны дараа яригдах нэг зүйл бол модны элементүүдэд
системтэйгээр очих явдал юм. Энэ үйлдэл нь шугаман жагсаалтад
хийгдэх үйлдлийн адил заагчийн тусламжтайгаар гүйцэтгэгдэх боловч
мод нь шугаман биш бүтэц учир тодорхой тооны ялгаатай замуудын
хувьд хийгдэх болно. Иймээс энэ үйлдэл нь модны элементүүдэд ямар
дарааллаас хүрхээс хамаарч ялгаатайгаар тодорхойлогдоно. Ер нь
модны аливаа элементэд үндсэн элементээс эхлэн хүрэх боломжтой
боловч элемент бүрт аль болох явсан замаа давтахгүйгээр очих
шаардлагатай.
 Модны элементэд очих гэдэг ойлголтын доор уг очсон элементд
боловсруулалт хийх, тухайлбал хэвлэх үйлдэл хамаарна. Хоѐртын
модны тухайн элементийг түүний зүүн ба баруун дэд модоор гүйх
үйлдлийн өмнө, дунд, эсвэл дараа нь боловсруулалт хийх дарааллаас
хамаарч ялгаатайгаар тодорхойлдог.
Хоёртын модоор гүйх
 1. Эхний арга нь урьтаж очих (preorder) арга юм. Энэ арга нь эхлээд
элементэд очоод дараа нь зүүн дэд модонд очоод эцэст нь баруун дэд
модонд очих гэсэн рекурсив дүрмээр зүүн ба баруун дэд мод бүрийн
хувьд гүйцэтгэгдэнэ.
 2. Модны элементүүдэд очих удаах (inorder) арга бол эхлээд зүүн дэд
модонд очоод дараа нь уг элементдээ ирээд эцэст нь баруун дэд
модонд очих гэсэн рекурсив дүрмээр тодорхойлогдоно. Өөрөөр хэлбэл
тухайн элементийн өгөгдлийг хэвлэхийн өмнө зүүн дэд модны
элементүүдийг хэвлэх бөгөөд харин баруун дэд модны элементүүдийг
сүүлд нь хэвлэнэ.
 3. Хоѐртын модны элементүүдэд очих 3 дахь арга бол хоцорч очих
(postorder) арга юм. Энэ арга нь эхлээд зүүн дэд модонд очоод, дараа
нь баруун дэд модонд очоод эцэст нь уг элементд очих гэсэн рекурсив
дүрмээр тодорхойлогдоно. Өөрөөр хэлбэл тухайн элементийн өгөгдлийн
зүүн ба баруун дэд модны өгөгдлийг хэвлээд дууссана дараа хэвлэнэ.
 4. Модны элементүүдэд очих 4 дэх арга бол модны дээрээс доошоо ба
зүүнээс баруун гэсэг чиглэлээр элементэд хүрдэг. Өөрөөр хэлбэл эхлээд
үндсэн элементийг хэвлээд дараа нь удаах түвшиний өгөгдлийг зүүнээс
баруун тийш хэвлэх байдлаар түвшингүүдийн хувьд дараалж
гүйцэтгэгдэнэ. Энэ аргыг ашиглан модыг хэрхэн хэвлэж байгаа кодыг
доор үзүүлэв
Хоёртын модоор гүйх
 46 node* search(node ** tree, int val) {
 47 if(!(*tree)) {
 48 return NULL;
 49 }
 50 if(val == (*tree)->data) {
 51 return *tree;
 52 } else if(val < (*tree)->data) {
 53 search(&((*tree)->left), val);
 54 } else if(val > (*tree)->data){
 55 search(&((*tree)->right), val);
 56 }
 57 }
[Lines 47-49] Check first if tree is empty,
then return NULL.
[Lines 50-51] Check if node value to be
searched is equal to root node value,
then return node
[Lines 52-53] Check if node value to be
searched is lesser than root node value,
then call search() function recursively
with left node
[Lines 54-55] Check if node value to be
searched is greater than root node
value, then call search() function
recursively with right node
Repeat step 2, 3, 4 for each recursion
call of this search function until node to
be searched is found.
Хоёртын мод устгах
38 void deltree(node * tree) {
39 if (tree) {
40 deltree(tree->left);
41 deltree(tree->right);
42 free(tree);
43 }
44 }
[Line 39] Check first if root node is non-NULL, then
a. [Line 40] Call deltree() function recursively while
there is non-NULL left node
b. [Line 41] Call deltree() function recursively while
there is non-NULL right node
c. [Line 42] Delete the node.
Хоёртын мод дүрслэх
Binary tree can be displayed in three forms – pre-order, in-order and post-order.
Pre-order displays root node, left node and then right node.
In-order displays left node, root node and then right node.
Post-order displays left node, right node and then root node
Хоёртын мод дүрслэх
 28 void print_preorder(node * tree) {
 29 if (tree) {
 30 printf("%dn",tree->data);
 31 print_preorder(tree->left);
 32 print_preorder(tree->right);
 33 }
 34 }
 35 void print_inorder(node * tree) {
 36 if (tree) {
 37 print_inorder(tree->left);
 38 printf("%dn",tree->data);
 39 print_inorder(tree->right);
 40 }
 41 }
 42 void print_postorder(node * tree) {
 43 if (tree) {
 44 print_postorder(tree->left);
 45 print_postorder(tree->right);
 46 printf("%dn",tree->data);
 47 }
 48 }
Pre-order display
a. [Line 30] Display value of root node.
b. [Line 31] Call print_preorder() function recursively while
there is non-NULL left node
c. [Line 32] Call print_preorder() function recursively while
there is non-NULL right node
In-order display
a. [Line 37]Call print_inorder() function recursively while
there is non-NULL left node
b. [Line38] Display value of root node.
c. [Line 39] Call print_inorder() function recursively while
there is non-NULL right node
Post-order display
a. [Line 44] Call print_postorder() function recursively while
there is non-NULL left node
b. [Line 45] Call print_postorder() function recursively while
there is non-NULL right node
c. [Line46] Display value of root node.
 #include<stdlib.h>
 #include<stdio.h>
 struct bin_tree {
 int data;
 struct bin_tree * right, * left;
 };
 typedef struct bin_tree node;
 void insert(node ** tree, int val)
 {
 node *temp = NULL;
 if(!(*tree))
 {
 temp = (node *)malloc(sizeof(node));
 temp->left = temp->right = NULL;
 temp->data = val;
 *tree = temp;
 return;
 }
 if(val < (*tree)->data)
 {
 insert(&(*tree)->left, val);
 }
 else if(val > (*tree)->data)
 {
 insert(&(*tree)->right, val);
 }
 }
Жишээ
#include<stdlib.h>
#include<stdio.h>
struct bin_tree {
int data;
struct bin_tree * right, * left;
};
typedef struct bin_tree node;
void insert(node ** tree, int val)
{
node *temp = NULL;
if(!(*tree))
{
temp = (node *)malloc(sizeof(node));
temp->left = temp->right = NULL;
temp->data = val;
*tree = temp;
return;
}
if(val < (*tree)->data)
{
insert(&(*tree)->left, val);
}
else if(val > (*tree)->data)
{
insert(&(*tree)->right, val);
}
}
void print_preorder(node * tree)
{
if (tree)
{
printf("%dn",tree->data);
print_preorder(tree->left);
print_preorder(tree->right);
}
}
void print_inorder(node * tree)
{
if (tree)
{
print_inorder(tree->left);
printf("%dn",tree->data);
print_inorder(tree->right);
}
}
void print_postorder(node * tree)
{
if (tree)
{
print_postorder(tree->left);
print_postorder(tree->right);
printf("%dn",tree->data);
}
}
void deltree(node * tree)
{
if (tree)
{
deltree(tree->left);
deltree(tree->right);
free(tree);
}
}
node* search(node ** tree, int val)
{
if(!(*tree))
{
return NULL;
}
if(val < (*tree)->data)
{
search(&((*tree)->left), val);
}
else if(val > (*tree)->data)
{
search(&((*tree)->right), val);
}
else if(val == (*tree)->data)
{
return *tree;
}
}
void main()
{
node *root;
node *tmp;
//int i;
root = NULL;
/* Inserting nodes into tree */
insert(&root, 9);
insert(&root, 4);
insert(&root, 15);
insert(&root, 6);
insert(&root, 12);
insert(&root, 17);
insert(&root, 2);
/* Printing nodes of tree */
printf("Pre Order Displayn");
print_preorder(root);
printf("In Order Displayn");
print_inorder(root);
printf("Post Order Displayn");
print_postorder(root);
/* Search node into tree */
tmp = search(&root, 4);
if (tmp)
{
printf("Searched node=%dn", tmp->data);
}
else
{
printf("Data Not found in tree.n");
}
/* Deleting all nodes of tree */
deltree(root);
}
 $ ./a.out
 Pre Order Display
 9
 4
 2
 6
 15
 12
 17
 In Order Display
 2
 4
 6
 9
 12
 15
 17
 Post Order Display
 2
 6
 4
 12
 17
 15
 9
 Searched node=4

More Related Content

What's hot

U.cs101 алгоритм программчлал-5 zasvar badral(1)
U.cs101   алгоритм программчлал-5 zasvar badral(1)U.cs101   алгоритм программчлал-5 zasvar badral(1)
U.cs101 алгоритм программчлал-5 zasvar badral(1)
Badral Khurelbaatar
 
өгөгдлийн сангийн системийн үндэс
өгөгдлийн сангийн системийн үндэсөгөгдлийн сангийн системийн үндэс
өгөгдлийн сангийн системийн үндэс
Бямбаа Авирмэд
 
өгөгдлийн сан
өгөгдлийн санөгөгдлийн сан
өгөгдлийн санOnon Tuul
 
U.cs101 алгоритм программчлал-3
U.cs101   алгоритм программчлал-3U.cs101   алгоритм программчлал-3
U.cs101 алгоритм программчлал-3
Badral Khurelbaatar
 
Шугаман алгоритмын бодлогууд
Шугаман алгоритмын бодлогуудШугаман алгоритмын бодлогууд
Шугаман алгоритмын бодлогуудБаярсайхан Л
 
C cons
C consC cons
C cons
Onon Tuul
 
U.cs101 алгоритм программчлал-10
U.cs101   алгоритм программчлал-10U.cs101   алгоритм программчлал-10
U.cs101 алгоритм программчлал-10
Badral Khurelbaatar
 
It101 lecture 7-1
It101 lecture 7-1It101 lecture 7-1
It101 lecture 7-1
Nergui Batjargal
 
Se304
Se304Se304
U.cs101 алгоритм программчлал-1(1)
U.cs101   алгоритм программчлал-1(1)U.cs101   алгоритм программчлал-1(1)
U.cs101 алгоритм программчлал-1(1)Badral Khurelbaatar
 
класс диаграм
класс диаграмкласс диаграм
класс диаграм
Unubold Tumenbayar
 
It101 4
It101 4It101 4
Ms access
Ms accessMs access
Ms access
Ziyakhan Raimbek
 

What's hot (20)

Лекц №11
Лекц №11Лекц №11
Лекц №11
 
U.cs101 алгоритм программчлал-5 zasvar badral(1)
U.cs101   алгоритм программчлал-5 zasvar badral(1)U.cs101   алгоритм программчлал-5 zasvar badral(1)
U.cs101 алгоритм программчлал-5 zasvar badral(1)
 
массив
массивмассив
массив
 
өгөгдлийн сангийн системийн үндэс
өгөгдлийн сангийн системийн үндэсөгөгдлийн сангийн системийн үндэс
өгөгдлийн сангийн системийн үндэс
 
It101 lect16
It101 lect16It101 lect16
It101 lect16
 
өгөгдлийн сан
өгөгдлийн санөгөгдлийн сан
өгөгдлийн сан
 
User requirements
User requirementsUser requirements
User requirements
 
It101 lect9
It101 lect9It101 lect9
It101 lect9
 
U.cs101 алгоритм программчлал-3
U.cs101   алгоритм программчлал-3U.cs101   алгоритм программчлал-3
U.cs101 алгоритм программчлал-3
 
Шугаман алгоритмын бодлогууд
Шугаман алгоритмын бодлогуудШугаман алгоритмын бодлогууд
Шугаман алгоритмын бодлогууд
 
C cons
C consC cons
C cons
 
U.cs101 алгоритм программчлал-10
U.cs101   алгоритм программчлал-10U.cs101   алгоритм программчлал-10
U.cs101 алгоритм программчлал-10
 
It101 lecture 7-1
It101 lecture 7-1It101 lecture 7-1
It101 lecture 7-1
 
Se304
Se304Se304
Se304
 
U.cs101 алгоритм программчлал-1(1)
U.cs101   алгоритм программчлал-1(1)U.cs101   алгоритм программчлал-1(1)
U.cs101 алгоритм программчлал-1(1)
 
класс диаграм
класс диаграмкласс диаграм
класс диаграм
 
Lecture 3
Lecture 3Lecture 3
Lecture 3
 
It101 4
It101 4It101 4
It101 4
 
Ms access
Ms accessMs access
Ms access
 
алгоритм 8
алгоритм 8алгоритм 8
алгоритм 8
 

More from Bayalagmaa Davaanyam

Online applications using strong authentication with OTP grid cards
Online applications using strong authentication with OTP grid cardsOnline applications using strong authentication with OTP grid cards
Online applications using strong authentication with OTP grid cards
Bayalagmaa Davaanyam
 
otp crid cards
otp crid cardsotp crid cards
otp crid cards
Bayalagmaa Davaanyam
 
Social sciences bayalagmaa
Social sciences bayalagmaaSocial sciences bayalagmaa
Social sciences bayalagmaa
Bayalagmaa Davaanyam
 
Мэдээлэл технологи ашиглан лекцийн үр дүнг дээшлүүлэх асуудал
Мэдээлэл технологи ашиглан лекцийн үр дүнг дээшлүүлэх асуудалМэдээлэл технологи ашиглан лекцийн үр дүнг дээшлүүлэх асуудал
Мэдээлэл технологи ашиглан лекцийн үр дүнг дээшлүүлэх асуудал
Bayalagmaa Davaanyam
 
Файлын оролт гаралт
Файлын оролт гаралтФайлын оролт гаралт
Файлын оролт гаралт
Bayalagmaa Davaanyam
 
Hash function
Hash functionHash function
Hash function
Bayalagmaa Davaanyam
 
C standard library
C standard libraryC standard library
C standard library
Bayalagmaa Davaanyam
 
Preproc
PreprocPreproc
Эрэмбэлэлт хайлтын аргууд
Эрэмбэлэлт хайлтын аргуудЭрэмбэлэлт хайлтын аргууд
Эрэмбэлэлт хайлтын аргууд
Bayalagmaa Davaanyam
 
9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргуудBayalagmaa Davaanyam
 
9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд
Bayalagmaa Davaanyam
 

More from Bayalagmaa Davaanyam (11)

Online applications using strong authentication with OTP grid cards
Online applications using strong authentication with OTP grid cardsOnline applications using strong authentication with OTP grid cards
Online applications using strong authentication with OTP grid cards
 
otp crid cards
otp crid cardsotp crid cards
otp crid cards
 
Social sciences bayalagmaa
Social sciences bayalagmaaSocial sciences bayalagmaa
Social sciences bayalagmaa
 
Мэдээлэл технологи ашиглан лекцийн үр дүнг дээшлүүлэх асуудал
Мэдээлэл технологи ашиглан лекцийн үр дүнг дээшлүүлэх асуудалМэдээлэл технологи ашиглан лекцийн үр дүнг дээшлүүлэх асуудал
Мэдээлэл технологи ашиглан лекцийн үр дүнг дээшлүүлэх асуудал
 
Файлын оролт гаралт
Файлын оролт гаралтФайлын оролт гаралт
Файлын оролт гаралт
 
Hash function
Hash functionHash function
Hash function
 
C standard library
C standard libraryC standard library
C standard library
 
Preproc
PreprocPreproc
Preproc
 
Эрэмбэлэлт хайлтын аргууд
Эрэмбэлэлт хайлтын аргуудЭрэмбэлэлт хайлтын аргууд
Эрэмбэлэлт хайлтын аргууд
 
9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд
 
9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд9.эрэмбэлэлтийн аргууд
9.эрэмбэлэлтийн аргууд
 

Мод, графын ерөнхий зарчим

  • 1. Мод Мод, графын ерөнхий зарчим. Тэдгээр дээр хийгдэх үйлдлүүд. Модоор гүйх аргууд
  • 2. Мод  Мод нь шугаман биш өгөгдлийн бүтэц юм. Энэ өгөгдийн бүтцийн зохион байгуулалт нь элементүүдийн шаталсан, нэгээс олон гэсэн харьцаагаар тодорхойлогддог. Бидний өдөр тутмын амьдралд модны хэрэглээ өдөр тутам тохиолдож байдаг. Жишээлбэл энд ургийн бичгийг дурьдж болох юм.  Мод нь ямар нэг нөхцлийг хангах тодорхой дүрмээр зохион байгуулагдсан элементүүд болон тэдгээрийг холбсон холбоосуудыг агуулдаг.  Элементийн мэдээллийг хадгалах ердийн нэг обьект ба холбоос нь хоѐр элементийн хоорондын харьцааг тодорхойлдог. Холбоосоор холбогдсон модны дараалсан элементүүдийн жагсаалтыг зам гэнэ. Модны бусад элементэд хүрэх зам нь давтагдашгүй тодорхойлох боломжтой нэг элементийг модын язгуур үндэс элемент гэж нэрлэдэг. Модыг графын онцгой нэг тохолдол гэж үзэж болно
  • 3. Мод  Модны холбоосуудад чиглэл тодорхойгүй бөгөөд холбоосуудын чиглэлийг тухайн бодлогоос хамааран үндсэн элементээс доош эсвэл үндсэн элементрүү гэсэн бүгд нэг чиглэлд хандсан мэтээр авч үздэг. Модны үндсэн элементийг ихэвчлэн хамгийн дээр нь зурдаг. Үндсэн элементээс ямар нэг У элементрүү хүрэх замд Х элемент тохиолдож байвал У элементийг Х элементийн доор байна гэж үзнэ.  Модны элемент бүр дээрээ зөвхөн нэг элементтэй холбогдох ба доороо хичнээн ч элемент агуулж болох ба тэдгээр элементүүдийг тухайн элементийн дэд элемент гэнэ. Тухайн элементийн дэд элементээс салаалсан элементийг дэд мод гэнэ.  Модны элементүүд түвшингүүдэд хуваагдан байрладаг ба элемент бүр тодорхой нэг түвшинд харьяалагдана. Эхний түвшин буюу 0 түвшинд зөвхөн үндсэн элемент байна. Модны гүн буюу өндөр нь модны түвшингийн тоогоор тодорхойлогдоно. Иймээс модны өндөр нь хамгийн их түвшингийн утгаас нэгээр их байна. Модны замын урт нь модон дахь бүх элементийн түвшингүүдийн нийлбэрээр тодорхойлогдоно.
  • 4. Мод Root node Leaf nodes Interior nodes Height Root  no parent Leaf  no child Interior  non-leaf Height  distance from root to leaf
  • 5. Хоѐртын мод  Хоѐртын мод нь модны нэг онцгой тохиолдлын нэг бөгөөд элемент бүр нь хоѐроос илүүгүй дэд зангилаатай байдаг. Хэрэв мод нэг ч элемент агуулаагүй бол хоосон мод буюу NULL мод юмуу элемент гэж нэрлэнэ. Элементийн дэд 2 элементийг зүүн дэд элемент, баруун дэд элемент гэж нэрэлдэг. Хоѐртын модны элемент нь 1, 2 дэд элемент агуулж болно. Харин төгсгөлийн элементүүд нь дэд элементүүдгүй бөгөөд 2 хоосон дэд модтой байна. Tree Binary Tree Tree Nodes Each node can have 0 or more children A node can have at most one parent Binary tree Tree with 0–2 children per node
  • 6. Хоѐртын мод  Модны хамгийн сүүлийн түвшингээс бусад түвшинд дотоод элементээр гүйцэд дүүргэгдсэн бол дүүрэн хоёртын мод гэнэ. Харин дотоод элементийг агуулах хамгийн сүүлийн түвшингийн зөвхөн баруун талд зарим гадаад элемент байвал түүнийг гүйцэд мод гэнэ
  • 7. Модны шинж чанарууд: Чанар 1.Модны ямар нэг 2 элементийг холбох ганц зам байна. Аль ч хоѐр элементийг авч үзхэд ядаж нэг ерөнхий эх элемент олдоно. Чанар 2. N элемент бүхий тод N-1 холбоостой байна. Энэ чанар нь үндсэн элементээс бусад бүх элемент нь зөвхөн ганц эх элементд шууд холбогдоно гэдгээс мөрдөн гарна. Чанар 3.N дотоод элемент бүхий хоёртын мод нь N+1 гадаад элементтэй байна. Энэ чанарыг индукц ашиглан батлья. Дотоод элементгүй буюу хоосон мод нь нэг гадаад элементтэй байна. Энэ тохиолдолд N=0 байна. N>0 үед N дотоод элементтэй хоѐртын модны K дотоод элемент нь зүүн дэд модонд, N-1-K дотоод элемент нь баруун дэд модонд байна. Индукцын зарчмаар зүүн дэд модонд K+1 гадаад элемент, баруун дэд модонд N-K гадаад элемент байдаг гэвэл нийт (K+1)+(N-K)=N+1 гадаад элементтэй байна.
  • 8. Модны шинж чанарууд: Чанар 4. N дотоод элемент бүхий хоёртын модны гадаад замын урт нь дотоод замын уртаас 2N-ээр илүү байдаг. Аливаа хоѐртын мод нь нэг гадаад элемент агуулах хоосон модноос эхлэн үүсдэг. Модонд шинээр нэг өгөгдөл нэмэх процесс нь нэг гадаад элементийг хоѐр гадаад элемент бүхий нэг дотоод элементээр сольдог. Хэрэв К түвшин дэх гадаад элементийг сольвол уг модны дотоод замын урт нь К утгаар нэмэгдэх ба харин гадаад замын урт нь К+2 уртаар (К түвшинээс 1 гадаад элемент хасагдаж, хоѐр гадаад элемент нь K+1 түвшинд орно) нэмэгдэнэ. Энэ процесс нь дотоод ба гадаад замын урт тэгтэй тэнцүү байхаас эхлэх бөгөөд N алхам бүрт дотоод замын уртаас 2-оос илүү утгаар нэмэгдэж байна. Чанар 5. Хоёртын модны I түвшинд хамгийн ихдээ 2-ийн i зэрэг элемент байна. Чанар 6. n өндөртөй 2тын модны максимум зангилааны тоо нь 2-ийн n зэргээс нэгийг хассантай тэнцүү Чанар 7. n дотоод элемент бүхий дүүрэн 2тын модны өндөр нь ойролцоогоор log 2 суурьтай n тэй тэнцүү.
  • 9. Хоёртын мод байгуулах  Хоѐртын модыг нэвтрүүлэх нэг арга бол түүний элементийг өгөгдөл болон хоѐр (зүүн/баруун) холбоос агуулах өгөгдлийн хийсвэр төрлөөр тодорхойлдог. Жишээ нь: илэрхийлэлд оролцож байгаа үйлдлийн тэмдэгүүд нь хоѐр аргумент авдаг бол үүнийг хоѐртын модоор илэрхийлж болно. Хэрэв олон янзын үйлдэл оролцсон хүндэвтэр илэрхийлэл байвал модыг арай өөр хэлбэрээр зохион байгуулах шаардлагатай.  Гэвч бидний зорилго энгийн арифметик илэрхийллийг ашиглан хоѐртын модыг байгуулах явдал юм.  A*(((B+C)*(D*E))+F) илэрхийлэлд харгалзах хоѐртын мод: (Polish тэмдэглэгээгээр хоѐртын мод үүсгэх болно. )  Жишээ:
  • 10. Хоёртын мод байгуулах 11 void insert(node ** tree, int val) { 12 node *temp = NULL; 13 if(!(*tree)) { 14 temp = (node *)malloc(sizeof(node)); 15 temp->left = temp->right = NULL; 16 temp->data = val; 17 *tree = temp; 18 return; 19 } 20 21 if(val < (*tree)->data) { 22 insert(&(*tree)->left, val); 23 } else if(val > (*tree)->data) { 24 insert(&(*tree)->right, val); 25 } 26 } Хоѐртын модны элемент нь BinTree загвар классаар тодорхойлогдох бөгөөд өгөгдөл болон зүүн баруун салаануудыг заах заагчуудыг агуулж байна. setr(), setl() гишүүн функцүүд нь тухайн элементийн баруун ба зүүн дэд модыг холбож өгөх ба харин getr(), getl() гишүүн функцүүд нь тухайн элементийн баруун ба зүүн дэд модыг буцаана. [Lines 13-19] Check first if tree is empty, then insert node as root. [Line 21] Check if node value to be inserted is lesser than root node value, then a. [Line 22] Call insert() function recursively while there is non-NULL left node b. [Lines 13-19] When reached to leftmost node as NULL, insert new node. [Line 23] Check if node value to be inserted is greater than root node value, then a. [Line 24] Call insert() function recursively while there is non-NULL right node b. [Lines 13-19] When reached to rightmost node as NULL, insert new node.
  • 11. Хоёртын модоор гүйх  Мод байгуулсны дараа яригдах нэг зүйл бол модны элементүүдэд системтэйгээр очих явдал юм. Энэ үйлдэл нь шугаман жагсаалтад хийгдэх үйлдлийн адил заагчийн тусламжтайгаар гүйцэтгэгдэх боловч мод нь шугаман биш бүтэц учир тодорхой тооны ялгаатай замуудын хувьд хийгдэх болно. Иймээс энэ үйлдэл нь модны элементүүдэд ямар дарааллаас хүрхээс хамаарч ялгаатайгаар тодорхойлогдоно. Ер нь модны аливаа элементэд үндсэн элементээс эхлэн хүрэх боломжтой боловч элемент бүрт аль болох явсан замаа давтахгүйгээр очих шаардлагатай.  Модны элементэд очих гэдэг ойлголтын доор уг очсон элементд боловсруулалт хийх, тухайлбал хэвлэх үйлдэл хамаарна. Хоѐртын модны тухайн элементийг түүний зүүн ба баруун дэд модоор гүйх үйлдлийн өмнө, дунд, эсвэл дараа нь боловсруулалт хийх дарааллаас хамаарч ялгаатайгаар тодорхойлдог.
  • 12. Хоёртын модоор гүйх  1. Эхний арга нь урьтаж очих (preorder) арга юм. Энэ арга нь эхлээд элементэд очоод дараа нь зүүн дэд модонд очоод эцэст нь баруун дэд модонд очих гэсэн рекурсив дүрмээр зүүн ба баруун дэд мод бүрийн хувьд гүйцэтгэгдэнэ.  2. Модны элементүүдэд очих удаах (inorder) арга бол эхлээд зүүн дэд модонд очоод дараа нь уг элементдээ ирээд эцэст нь баруун дэд модонд очих гэсэн рекурсив дүрмээр тодорхойлогдоно. Өөрөөр хэлбэл тухайн элементийн өгөгдлийг хэвлэхийн өмнө зүүн дэд модны элементүүдийг хэвлэх бөгөөд харин баруун дэд модны элементүүдийг сүүлд нь хэвлэнэ.  3. Хоѐртын модны элементүүдэд очих 3 дахь арга бол хоцорч очих (postorder) арга юм. Энэ арга нь эхлээд зүүн дэд модонд очоод, дараа нь баруун дэд модонд очоод эцэст нь уг элементд очих гэсэн рекурсив дүрмээр тодорхойлогдоно. Өөрөөр хэлбэл тухайн элементийн өгөгдлийн зүүн ба баруун дэд модны өгөгдлийг хэвлээд дууссана дараа хэвлэнэ.  4. Модны элементүүдэд очих 4 дэх арга бол модны дээрээс доошоо ба зүүнээс баруун гэсэг чиглэлээр элементэд хүрдэг. Өөрөөр хэлбэл эхлээд үндсэн элементийг хэвлээд дараа нь удаах түвшиний өгөгдлийг зүүнээс баруун тийш хэвлэх байдлаар түвшингүүдийн хувьд дараалж гүйцэтгэгдэнэ. Энэ аргыг ашиглан модыг хэрхэн хэвлэж байгаа кодыг доор үзүүлэв
  • 13. Хоёртын модоор гүйх  46 node* search(node ** tree, int val) {  47 if(!(*tree)) {  48 return NULL;  49 }  50 if(val == (*tree)->data) {  51 return *tree;  52 } else if(val < (*tree)->data) {  53 search(&((*tree)->left), val);  54 } else if(val > (*tree)->data){  55 search(&((*tree)->right), val);  56 }  57 } [Lines 47-49] Check first if tree is empty, then return NULL. [Lines 50-51] Check if node value to be searched is equal to root node value, then return node [Lines 52-53] Check if node value to be searched is lesser than root node value, then call search() function recursively with left node [Lines 54-55] Check if node value to be searched is greater than root node value, then call search() function recursively with right node Repeat step 2, 3, 4 for each recursion call of this search function until node to be searched is found.
  • 14. Хоёртын мод устгах 38 void deltree(node * tree) { 39 if (tree) { 40 deltree(tree->left); 41 deltree(tree->right); 42 free(tree); 43 } 44 } [Line 39] Check first if root node is non-NULL, then a. [Line 40] Call deltree() function recursively while there is non-NULL left node b. [Line 41] Call deltree() function recursively while there is non-NULL right node c. [Line 42] Delete the node.
  • 15. Хоёртын мод дүрслэх Binary tree can be displayed in three forms – pre-order, in-order and post-order. Pre-order displays root node, left node and then right node. In-order displays left node, root node and then right node. Post-order displays left node, right node and then root node
  • 16. Хоёртын мод дүрслэх  28 void print_preorder(node * tree) {  29 if (tree) {  30 printf("%dn",tree->data);  31 print_preorder(tree->left);  32 print_preorder(tree->right);  33 }  34 }  35 void print_inorder(node * tree) {  36 if (tree) {  37 print_inorder(tree->left);  38 printf("%dn",tree->data);  39 print_inorder(tree->right);  40 }  41 }  42 void print_postorder(node * tree) {  43 if (tree) {  44 print_postorder(tree->left);  45 print_postorder(tree->right);  46 printf("%dn",tree->data);  47 }  48 } Pre-order display a. [Line 30] Display value of root node. b. [Line 31] Call print_preorder() function recursively while there is non-NULL left node c. [Line 32] Call print_preorder() function recursively while there is non-NULL right node In-order display a. [Line 37]Call print_inorder() function recursively while there is non-NULL left node b. [Line38] Display value of root node. c. [Line 39] Call print_inorder() function recursively while there is non-NULL right node Post-order display a. [Line 44] Call print_postorder() function recursively while there is non-NULL left node b. [Line 45] Call print_postorder() function recursively while there is non-NULL right node c. [Line46] Display value of root node.
  • 17.  #include<stdlib.h>  #include<stdio.h>  struct bin_tree {  int data;  struct bin_tree * right, * left;  };  typedef struct bin_tree node;  void insert(node ** tree, int val)  {  node *temp = NULL;  if(!(*tree))  {  temp = (node *)malloc(sizeof(node));  temp->left = temp->right = NULL;  temp->data = val;  *tree = temp;  return;  }  if(val < (*tree)->data)  {  insert(&(*tree)->left, val);  }  else if(val > (*tree)->data)  {  insert(&(*tree)->right, val);  }  }
  • 19. #include<stdlib.h> #include<stdio.h> struct bin_tree { int data; struct bin_tree * right, * left; }; typedef struct bin_tree node; void insert(node ** tree, int val) { node *temp = NULL; if(!(*tree)) { temp = (node *)malloc(sizeof(node)); temp->left = temp->right = NULL; temp->data = val; *tree = temp; return; } if(val < (*tree)->data) { insert(&(*tree)->left, val); } else if(val > (*tree)->data) { insert(&(*tree)->right, val); } }
  • 20. void print_preorder(node * tree) { if (tree) { printf("%dn",tree->data); print_preorder(tree->left); print_preorder(tree->right); } } void print_inorder(node * tree) { if (tree) { print_inorder(tree->left); printf("%dn",tree->data); print_inorder(tree->right); } } void print_postorder(node * tree) { if (tree) { print_postorder(tree->left); print_postorder(tree->right); printf("%dn",tree->data); } } void deltree(node * tree) { if (tree) { deltree(tree->left); deltree(tree->right); free(tree); } } node* search(node ** tree, int val) { if(!(*tree)) { return NULL; } if(val < (*tree)->data) { search(&((*tree)->left), val); } else if(val > (*tree)->data) { search(&((*tree)->right), val); } else if(val == (*tree)->data) { return *tree; } }
  • 21. void main() { node *root; node *tmp; //int i; root = NULL; /* Inserting nodes into tree */ insert(&root, 9); insert(&root, 4); insert(&root, 15); insert(&root, 6); insert(&root, 12); insert(&root, 17); insert(&root, 2); /* Printing nodes of tree */ printf("Pre Order Displayn"); print_preorder(root); printf("In Order Displayn"); print_inorder(root); printf("Post Order Displayn"); print_postorder(root); /* Search node into tree */ tmp = search(&root, 4); if (tmp) { printf("Searched node=%dn", tmp->data); } else { printf("Data Not found in tree.n"); } /* Deleting all nodes of tree */ deltree(root); }
  • 22.  $ ./a.out  Pre Order Display  9  4  2  6  15  12  17  In Order Display  2  4  6  9  12  15  17  Post Order Display  2  6  4  12  17  15  9  Searched node=4