Binary Tree in C

Pongsatorn Manusopit
2 min readMar 7, 2017

--

Binary tree เป็นอีกรูปแบบนึ่งของการจัดเก็บข้อมูล

Binary tree แต่ละ node จะเก็บข้อมูลของตัวเองและ pointer 2 ตัว เอาไว้ชี้ไปยัง node ซ้ายและขวา
จุดเริ่มต้นของ binary tree เรียกว่า root
node ลูกซ้ายเรียก left subtree node ลูกขวาเรียก right subtree
node ที่ไม่มีลูกต่อเรียก leaf

การนำ binary tree ไปใช้งาน

จะยกตัวอย่างการจัดเก็บข้อมูลตัวเลขโดยเรียงให้ตัวเลยน้อยกว่าหรือเท่ากันให้เป็น left subtree ส่วนถ้ามีค่ามากกว่าให้ เป็น right subtree

สร้าง struct ที่จะเอาไว้เก็บข้อมูลของเรา

typedef struct node{
int value;
struct node *left,*right;
} NODE;

สร้าง function เพื่อนำข้อมูลมาสร้าง tree

กรอบเหลืองถ้าไม่มีให้ newnode เป็น root ไปเลย
กรอบสีน้ำเงิน ถ้าค่าที่ใส่มากกว่าให้ใส่ข้อมูลทางขวาเลยถ้าว่างแต่ถ้าไม่ว่าจะเรียก function ตัวเองอีกรอบทำไปจนเจอ NULL แล้วค่อยเติม
กรอบสีเขียนก็เช่นกันเพียงแค่ถ้าค่าน้อยกว่าหรือเท่ากันให้ไปทางซ้าย

การที่ function เรียน function ตัวเองซ้ำเรียกการทำแบบนี้ว่า Recursion

ในตอนแรกเรา run insertnode(&root,25);

ในการทำงานเนื่องจากทางขวามี node ต่อทำให้ต้องเรียกตัวเองซ้ำโดน
insertnode(&((*root)->right),25);
จะเห็นว่ามันมากว่า 20 และด้านขวายังไงมี node ต่อก็ต้องเรียนตัวเองซ่ำอีกจนกว่าจะเจอ NULL

เมื่อว่าถึงตำแน่งที่ไม่มี node ต่อแล้วก็ให้เอา node ที่เราสร้างขึ้นมาเอาไปต่อ
ค่าของเราน้อยกว่า 30 ดังนั้นก็ให่ต่อไปด้านซ้าย

ขอดีของการเก็บข้อมูลที่เราเรียกกันด้วยวิธีแบบนี้

ปกติการค้นหาค่าหากเก็บข้อมูลปกติเราต้อง loop ไล่ไปจากหัวจนกว่าจะเจอ แต่ binary tree ทำให้เราหาข้อมูลเจอได้ไว้กว่าเพราะการเทียบค่าจะทำให้จำนวนข้อมูลลดลงได้สูงสุดครึ่งนึงของ tree ในทุกๆครั้ง

จากภาพเราทำการค้นหา 5 ใน tree ของเราการเทียบครั้งแรกทำให้เราตัด tree ฝั่งขวาออกไปได้เลยเนื่องจากค่ามากกว่าอยู่แล้ว ทำให้เราลดเวลาให้การค้นหาได้หากเจอข้อมูลจำนวนมากๆ

int search(TREE *root,int value){
if(*root!=NULL){
if(value!=(*root)->value){
if(value>(*root)->value){
bs(&((*root)->right),value);
}else{
bs(&((*root)->left),value);
}
}else{
return 1;
}
}else{
return 0;
}
}

--

--