Skip to content

Instantly share code, notes, and snippets.

@SalManRAMc
Created December 31, 2023 17:52
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SalManRAMc/fa636355cc042df3868b630e19ba8c97 to your computer and use it in GitHub Desktop.
Save SalManRAMc/fa636355cc042df3868b630e19ba8c97 to your computer and use it in GitHub Desktop.
Code for Printing a Binary Search Tree Vertically
#include "main.h"
/**
* Traverse_Breadth2 - same function with more features.
*
* @root: root of tree
*/
void Traverse_Breadth2(treenode *root)
{
if (root == NULL)
{
return;
}
int treeHeight = find_depth(root);
int nodesInLevel, nodesInNextLevel, spaces;
Queue *q = createQueue();
treenode *current;
enqueue(q, root);
for (int level = 1; level <= treeHeight; level++)
{
nodesInLevel = 1 << (level - 1);
nodesInNextLevel = nodesInLevel;
spaces = (1 << (treeHeight - level + 1) - 1);
printSpaces(spaces);
for (int i = 0; i < nodesInLevel; i++)
{
current = dequeue(q);
if (current != NULL)
{
printf("%d", current->data);
enqueue(q, current->left);
enqueue(q, current->right);
}
else
{
printf(" ");
enqueue(q, NULL);
enqueue(q, NULL);
}
if (i < nodesInLevel - 1) {
printSpaces(4);
}
}
printf("\n");
for (int i = 0; i < nodesInNextLevel; i++)
{
printSpaces(spaces - 2);
if (current == NULL)
{
printSpaces(2);
continue;
}
if (current->left == NULL && current->right == NULL)
{
continue;
}
else if (current->left != NULL && current->right == NULL)
{
printSpaces(2);
putchar('/');
}
else if (current->left == NULL && current->right != NULL)
{
printSpaces(3);
putchar('\\');
}else
{
printSpaces(2);
putchar('/');
printSpaces(2);
putchar('\\');
}
}
printf("\n");
}
free(q);
}
#include "main.h"
/**
* find_depth - calculates depth of tree
*
* @root: root of tree
*
* Return: depth value
*/
int find_depth(treenode *root)
{
int leftdepth, rightdepth;
leftdepth = rightdepth = 0;
if (root == NULL)
return (0);
leftdepth = find_depth(root->left);
rightdepth = find_depth(root->right);
return ((leftdepth > rightdepth ? leftdepth : rightdepth) + 1);
}
#include "main.h"
/*
*free_tree - frees tree
*
* @root - tree root
*
* */
void free_tree(treenode* root)
{
if (root == NULL)
{
return;
}
free_tree(root->left);
free_tree(root->right);
free(root);
}
#include "main.h"
/**
*insert_tnode - inserts a treenode in a binary search tree
*
* @treeroot: root of tree
* @inserted_data: data to insert
*
* Return: pointer to new node
*/
treenode *insert_tnode(treenode *treeroot, int inserted_data)
{
treenode *navigator = treeroot;
if (navigator == NULL)
{
navigator = (treenode *)malloc(sizeof(treenode));
if (navigator == NULL)
{
exit(98);
}
else
{
navigator->data = inserted_data;
navigator->right = NULL;
navigator->left = NULL;
return (navigator);
}
}
if (inserted_data > navigator->data)
{
navigator->right = insert_tnode(navigator->right, inserted_data);
}
else if (inserted_data < navigator->data)
{
navigator->left = insert_tnode(navigator->left, inserted_data);
}
else
{
printf("This number already exists in the tree");
return (NULL);
}
return (navigator);
}
/**
* newNode - create a new node with given data
*
* @address: address of treenode stored in linked list
*
* Return: Return a pointer to new node
*/
Node *newNode(treenode *address)
{
Node *node = (Node *)malloc(sizeof(node));
node->address = address;
node->next = NULL;
return (node);
}
#include "main.h"
/**
* main - tests code
*
* Return: 0 on success, 1 on failure
*/
int main(void)
{
treenode *root = NULL;
Queue q;
int left1, right2, depth;
root = insert_tnode(root, 5);
insert_tnode(root, 45);
insert_tnode(root, 25);
insert_tnode(root, 7);
insert_tnode(root, 10);
insert_tnode(root, 3);
insert_tnode(root, 105);
insert_tnode(root, 2);
insert_tnode(root, 4);
insert_tnode(root, 1);
printf("\n");
Traverse_Breadth2(root);
free_tree(root);
return (0);
}
#ifndef MAIN_H
#define MAIN_H
#include <stdio.h>
#include <stdlib.h>
/**
* struct treenode - struct for trees
* @data: data stored inside treenode
* @right: pointer to right subtree
* @left: pointer to left subtree
*
* Description: The struct I'll be using to make my trees
*/
typedef struct treenode
{
int data;
struct treenode *right;
struct treenode *left;
} treenode;
/**
* struct Node - struct for linked lists
* @address: address of treenode stored in node
* @next: pointer to next node
*
* Description: Struct used for simple linked lists
*/
typedef struct Node
{
treenode *address;
struct Node *next;
} Node;
/**
* struct Queue - struct for queues
* @front: front of queue
* @rear: back of queue
*/
typedef struct Queue
{
Node *front, *rear;
} Queue;
treenode *insert_tnode(treenode *treeroot, int inserted_data);
Node *newNode(treenode *data);
Queue *createQueue();
void enqueue(Queue *q, treenode *address);
treenode *dequeue(Queue *q);
void free_tree(treenode *root);
int print_horizontal(treenode *root);
int find_depth(treenode *root);
int ReturnMAX(treenode *root);
int ReturnMIN(treenode *root);
void Traverse_Breadth(treenode *root);
void printSpaces(int numSpaces);
void Traverse_Breadth2(treenode *root);
#endif
#include "main.h"
/**
* printSpaces - prints spaces based on input
*
* @numSpaces: number of spaces
*/
void printSpaces(int numSpaces)
{
for (int i = 0; i < numSpaces; i++)
{
printf(" ");
}
}
#include "main.h"
/**
* createQueue - Function to create an empty queue
*
* Return: pointer to Queue
*/
Queue *createQueue()
{
Queue *q;
q = (Queue *)malloc(sizeof(Queue));
q->front = q->rear = NULL;
return (q);
}
/**
* enqueue - Function to add an element to the rear of the queue
*
* @q: pointer to q
* @address: ptr to treenode
*/
void enqueue(Queue *q, treenode *address)
{
Node *node = newNode(address);
if (q->rear == NULL)
{
q->front = q->rear = node;
return;
}
q->rear->next = node;
q->rear = node;
}
/**
* dequeue - Function to remove an element from the front of the queue
*
* @q: pointer to q
* Return: treenode at front of queue
*/
treenode *dequeue(Queue *q)
{
Node *temp;
treenode *res;
if (q->front == NULL)
return (NULL);
temp = q->front;
q->front = q->front->next;
if (q->front == NULL)
q->rear = NULL;
res = temp->address;
free(temp);
return (res);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment