updated documentation and format

This commit is contained in:
Amit 2020-06-11 19:35:59 +05:30
parent 93e1bfc1f9
commit e63c806f25

View File

@ -1,160 +1,157 @@
/**
* @file
* \brief Threaded Binary Tree is a binary tree variant in which all left child
* pointers that are NULL (in Linked list representation) point to its
* in-order predecessor, and all right child pointers that are NULL
* (in Linked list representation) point to its in-order successor.
* This file is a simple implementation of a Threaded Binary Tree
* with the following functionalities:
* - Insertion
* - Search
* - Deletion
* - Listing of node keys inorder,preorder,postorder
* \author [Amitha Nayak](https://github.com/amitnayakblr)
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
/*Threaded Binary Tree is a binary tree variant in which all left child /**
pointers that are NULL (in Linked list representation) point to its * Node, the basic data structure of the tree
in-order predecessor, and all right child pointers that are NULL **/
(in Linked list representation) point to its in-order successor. typedef struct Node {
int data; /**< stores the number */
This file is a simple implementation of a Threaded Binary Tree struct Node *llink; /**< link to left child */
with the following functionalities: struct Node *rlink; /**< link to right child */
- Insertion
- Search
- Deletion
- Listing of node keys inorder,preorder, postorder
*/
// Node, the basic data structure in the tree
typedef struct Node
{
int data;
struct Node *llink;
struct Node *rlink;
} node; } node;
node* create_node(int data) /**
{ * creates a new node
* param[in] data value to be inserted
* \returns a pointer to the new node
**/
node *create_node(int data) {
node *ptr = (node *)malloc(sizeof(node)); node *ptr = (node *)malloc(sizeof(node));
ptr->rlink = ptr->llink = NULL; ptr->rlink = ptr->llink = NULL;
ptr->data = data; ptr->data = data;
return ptr; return ptr;
} }
void insert_BT(node **root,int data) /**
{ * inserts a node into the tree
* param[in,out] root pointer to node pointer to the topmost node of the tree
* param[in] data value to be inserted into the tree
*/
void insert_BT(node **root, int data) {
node *new_node = create_node(data); node *new_node = create_node(data);
node *temp; // to be deleted node *temp; // to be deleted
node *prev; // keeps track of the parent of the element deleted node *prev; // keeps track of the parent of the element deleted
if(*root==NULL) if (*root == NULL) {
{
*root = new_node; *root = new_node;
} } else {
else
{
temp = *root; temp = *root;
prev = NULL; prev = NULL;
while(temp!=NULL) while (temp != NULL) {
{ if (new_node->data > temp->data) {
if(new_node->data>temp->data)
{
prev = temp; prev = temp;
temp = temp->rlink; temp = temp->rlink;
} } else if (new_node->data < temp->data) {
else if(new_node->data<temp->data)
{
prev = temp; prev = temp;
temp = temp->llink; temp = temp->llink;
} } else {
else
{
return; return;
} }
} }
if(new_node->data>prev->data) if (new_node->data > prev->data) {
{
prev->rlink = new_node; prev->rlink = new_node;
} } else {
else
{
prev->llink = new_node; prev->llink = new_node;
} }
} }
} }
// returns "Element found" if the search element is present else returns, "Element not found" /**
void search(node *root, int ele) * searches for the element
{ * \param[in] root node pointer to the topmost node of the tree
* \param[in] ele value searched for
*/
void search(node *root, int ele) {
node *temp = root; node *temp = root;
while(temp!=NULL) while (temp != NULL) {
{ if (temp->data == ele) {
if(temp->data==ele)
{
break; break;
} } else if (ele > temp->data) {
else if(ele>temp->data)
{
temp = temp->rlink; temp = temp->rlink;
} } else {
else
{
temp = temp->llink; temp = temp->llink;
} }
} }
if(temp==NULL) if (temp == NULL) {
{
printf("%s\n", "Element not found."); printf("%s\n", "Element not found.");
} } else
else printf("%s\n","Element found." ); printf("%s\n", "Element found.");
} }
void inorder_display(node *curr) /*
{ * performs inorder traversal
if(curr!=NULL) * param[in] curr node pointer to the topmost node of the tree
{ */
void inorder_display(node *curr) {
if (curr != NULL) {
inorder_display(curr->llink); inorder_display(curr->llink);
printf("%d\t", curr->data); printf("%d\t", curr->data);
inorder_display(curr->rlink); inorder_display(curr->rlink);
} }
} }
void postorder_BT(node *curr) /*
{ * performs postorder traversal
if(curr!=NULL) * param[in] curr node pointer to the topmost node of the tree
{ */
void postorder_BT(node *curr) {
if (curr != NULL) {
postorder_BT(curr->llink); postorder_BT(curr->llink);
postorder_BT(curr->rlink); postorder_BT(curr->rlink);
printf("%d\t", curr->data); printf("%d\t", curr->data);
} }
} }
void preorder_BT(node *curr) /*
{ * performs preorder traversal
if(curr!=NULL) * param[in] curr node pointer to the topmost node of the tree
{ */
void preorder_BT(node *curr) {
if (curr != NULL) {
printf("%d\t", curr->data); printf("%d\t", curr->data);
preorder_BT(curr->llink); preorder_BT(curr->llink);
preorder_BT(curr->rlink); preorder_BT(curr->rlink);
} }
} }
// deletes the node if present, else it takes no action. /*
void delete_BT(node **root,int ele) * deletion of a node from the tree
{ * if the node isn't present in the tree, it takes no action.
* param[in,out] root pointer to node pointer to the topmost node of the tree
* param[in] ele value to be deleted from the tree
*/
void delete_BT(node **root, int ele) {
node *temp; node *temp;
node *prev; node *prev;
if(*root==NULL) return; if (*root == NULL)
else return;
{ else {
temp = *root; temp = *root;
prev = NULL; prev = NULL;
// search // search
while(temp!=NULL) while (temp != NULL) {
{ if (temp->data == ele) {
if(temp->data==ele)
{
break; break;
} } else if (ele > temp->data) {
else if(ele>temp->data)
{
prev = temp; prev = temp;
temp = temp->rlink; temp = temp->rlink;
} } else {
else
{
prev = temp; prev = temp;
temp = temp->llink; temp = temp->llink;
} }
@ -163,70 +160,56 @@ void delete_BT(node **root,int ele)
if (temp == NULL) if (temp == NULL)
return; return;
else else {
{
node *replacement; // deleted node's replacement node *replacement; // deleted node's replacement
node *t; node *t;
if(temp->llink==NULL && temp->rlink==NULL) if (temp->llink == NULL && temp->rlink == NULL) {
{
replacement = NULL; replacement = NULL;
} } else if (temp->llink == NULL && temp->rlink != NULL) {
else if(temp->llink==NULL && temp->rlink!=NULL)
{
replacement = temp->rlink; replacement = temp->rlink;
} } else if (temp->llink != NULL && temp->rlink == NULL) {
else if(temp->llink!=NULL && temp->rlink==NULL)
{
replacement = temp->llink; replacement = temp->llink;
} } else {
else
{
replacement = temp->rlink; // replaced with inorder successor replacement = temp->rlink; // replaced with inorder successor
t = replacement; t = replacement;
while(t->llink!=NULL) while (t->llink != NULL) {
{
t = t->llink; t = t->llink;
} }
t->llink=temp->llink; //leftmost node of the replacement is linked to the left child of the deleted node t->llink = temp->llink; // leftmost node of the replacement is linked to
// the left child of the deleted node
} }
if(temp==*root) if (temp == *root) {
{
free(*root); free(*root);
*root = replacement; *root = replacement;
} } else if (prev->llink == temp) {
else if(prev->llink==temp)
{
free(prev->llink); free(prev->llink);
prev->llink = replacement; prev->llink = replacement;
} } else if (prev->rlink == temp) {
else if(prev->rlink==temp)
{
free(prev->rlink); free(prev->rlink);
prev->rlink = replacement; prev->rlink = replacement;
} }
} }
} }
/*
void main() * main function
{ */
printf("BINARY TREE: \n"); void main() {
printf("BINARY THREADED TREE: \n");
node *root = NULL; node *root = NULL;
int choice, n; int choice, n;
do do {
{
printf("%s\n", "1. Insert into BT"); printf("%s\n", "1. Insert into BT");
printf("%s\n", "2. Print BT - inorder"); printf("%s\n", "2. Print BT - inorder");
printf("%s\n", "3. Print BT - preorder"); printf("%s\n", "3. Print BT - preorder");
printf("%s\n", "4. print BT - postorder"); printf("%s\n", "4. print BT - postorder");
printf("%s\n", "5. delete from BT"); printf("%s\n", "5. delete from BT");
printf("%s\n", "6. search in BT"); printf("%s\n", "6. search in BT");
printf("%s\n", "Type 0 to exit");
scanf("%d", &choice); scanf("%d", &choice);
switch (choice) {
switch(choice)
{
case 1: case 1:
printf("%s\n", "Enter a no:"); printf("%s\n", "Enter a no:");
scanf("%d", &n); scanf("%d", &n);
@ -255,6 +238,5 @@ void main()
search(root, n); search(root, n);
break; break;
} }
} while (choice != 0); } while (choice != 0);
} }