Write a program to find maximum height of the odd level leaf node of a binary tree. The problem has been picked up from GeeksforGeeks
A quick solution will be to use the solution for finding the max depth of the tree and modifying it to calculate the depth using only the odd level leaf nodes.
Read more ...
Search This Blog
Showing posts with label Data Structures. Show all posts
Showing posts with label Data Structures. Show all posts
Sep 2, 2013Find depth of the deepest odd level leaf node in a binary treeAug 29, 2013Find max height of a binary tree
Program for finding maximum depth or height of a binary tree /**
* find height of the tree recursively
*/
public static int maxHeight()
{
return maxHeight(root, 0);
}
private static int maxHeight(Node node, int h)
{
if (node == null)
{
return h;
}
int lh = maxHeight(node.left, h + 1);
int rh = maxHeight(node.right, h + 1);
return (lh > rh) ? lh : rh;
}
Read more ... Aug 25, 2013Creating a binary search tree using iterative approach in Java
Program for creating a binary search tree using iterative method private void addNode(Node node, int n)
{
while (node != null)
{
if(n < node.data)
{
if(node.left != null)
{
node = node.left;
}
else
{
node.left = new Node(n);
return;
}
}
else if(n > node.data)
{
if(node.right != null)
{
node = node.right;
}
else
{
node.right = new Node(n);
return;
}
}
else
{
System.out.println("WARNING: Elements are equal");
return;
}
}
}
Read more ... Creating a binary search tree using recursion in Java
Program for creating binary search tree using recursive method private void addNode(Node node, int n)
{
if (n < node.data)
{
if (node.left != null)
{
addNode(node.left, n);
}
else
{
node.left = new Node(n);
}
}
else if (n > node.data)
{
if (node.right != null)
{
addNode(node.right, n);
}
else
{
node.right = new Node(n);
}
}
else
{
System.out.println("WARNING: Number exists already");
}
}
Read more ... Jan 1, 2013Stack implementation using a singly linked list
The below is a stack implementation using a singly linked list. package com.ds.programs;
class StackNode<E>
{
E data;
StackNode<E> next;
}
Read more ... Mar 25, 2012Vertical Sum of a Binary TreeThe binary tree above can be represented as the following to calculate the vertical sum of the nodes Read more ... Mar 24, 2012Remove a node from Binary Search Tree
C++ Read more ... Insert a node in Binary Search Tree
C++Double pointer approach void insert(BinaryTreeNode **node, int data)
{
if(*node == NULL)
{
*node = getNewNode(data);
}
if(data == (*node)->data)
{
//do nothing
}
else if(data < (*node)->data)
{
insert(&(*node)->left, data);
}
else
{
insert(&(*node)->right, data);
}
}
Single pointer approach BinaryTreeNode* insert(BinaryTreeNode *node, int data)
{
if(node == NULL)
{
node = getNewNode(data);
return node;
}
if(data == node->data)
{
//do nothing
}
else if(data < node->data)
{
node->left = insert(node->left, data);
}
else
{
node->right = insert(node->right, data);
}
return node;
}
Read more ... Dec 6, 2011Traversing a Binary Tree
There are basically two ways of traversing a binary tree template <typename T> void BTTraveller<T>::inOrder(BSTNode<T> *node, std::deque<T> &out) { if(node) { inOrder(node->left, out); out.push_back(node->key); inOrder(node->right, out); } } 2. Preorder Traversal template <typename T> void BTTraveller<T>::preOrder(BSTNode<T> *node, std::deque<T> &out) { if(node) { out.push_back(node->key); preOrder(node->left, out); preOrder(node->right, out); } } 3. Postorder Traversal template <typename T> void BTTraveller<T>::postOrder(BSTNode<T> *node, std::deque<T> &out) { if(node) { postOrder(node->left, out); postOrder(node->right, out); out.push_back(node->key); } } Breadth First Traversal There is only one kind of Breadth first traversal viz. Level Order traversal. This traversal does not move along the branches of the tree but makes use of a FIFO queue. In the sample code, I have used std::deque as the helper queue for achieving the same.template <typename T> void BTTraveller<T>::levelOrder(BST<T> *bstree, std::deque<T> &out) { std::deque<BSTNode<T>*> hQ; hQ.push_back(bstree->m_root); levelOrder(hQ, out); } template <typename T> void BTTraveller<T>::levelOrder(std::deque<BSTNode<T>*> &hQ, std::deque<T> &out) { while(hQ.empty() == false) { BSTNode<T> *current = hQ.front(); if(current != NULL) { hQ.pop_front(); out.push_back(current->key); addChildren(current, hQ); } } } The BTTraveller class takes care of returning Binary Tree node elements in the order you are traversing the tree.1 #ifndef _BTTraveller_H_ 2 #define _BTTraveller_H_ 3 #include "BSTNode.h" 4 #include <deque> 5 6 //File: BTTraveller.h 7 namespace algorithms 8 { 9 template <typename T> 10 class BTTraveller 11 { 12 public: 13 static void inOrder(BST<T> *bstree, std::deque<T> &elems); 14 static void preOrder(BST<T> *bstree, std::deque<T> &elems); 15 static void postOrder(BST<T> *bstree, std::deque<T> &elems); 16 static void levelOrder(BST<T> *bstree, std::deque<T> &elems); 17 18 private: 19 static void inOrder(BSTNode<T> *node, std::deque<T> &elems); 20 static void preOrder(BSTNode<T> *node, std::deque<T> &elems); 21 static void postOrder(BSTNode<T> *node, std::deque<T> &elems); 22 static void levelOrder(std::deque<BSTNode<T>*> &helperQ, std::deque<T> &elems); 23 static void addChildren(BSTNode<T> *node, std::deque<BSTNode<T>*> &helperQ); 24 25 BTTraveller(); 26 BTTraveller(const BTTraveller&); 27 const BTTraveller& operator=(const BTTraveller&); 28 }; 29 }; 30 31 #include "BTTraveller.hpp" 32 #endif //_BTTraveller_H_ 1 //File: BTTraveller.hpp 2 namespace algorithms 3 { 4 template <typename T> 5 void BTTraveller<T>::inOrder(BST<T> *bstree, std::deque<T> &out) 6 { 7 inOrder(bstree->m_root, out); 8 } 9 10 template <typename T> 11 void BTTraveller<T>::preOrder(BST<T> *bstree, std::deque<T> &out) 12 { 13 preOrder(bstree->m_root, out); 14 } 15 16 template <typename T> 17 void BTTraveller<T>::postOrder(BST<T> *bstree, std::deque<T> &out) 18 { 19 postOrder(bstree->m_root, out); 20 } 21 22 template <typename T> 23 void BTTraveller<T>::levelOrder(BST<T> *bstree, std::deque<T> &out) 24 { 25 std::deque<BSTNode<T>*> hQ; 26 hQ.push_back(bstree->m_root); 27 levelOrder(hQ, out); 28 } 29 30 template <typename T> 31 void BTTraveller<T>::inOrder(BSTNode<T> *node, std::deque<T> &out) 32 { 33 if(node) 34 { 35 inOrder(node->left, out); 36 out.push_back(node->key); 37 inOrder(node->right, out); 38 } 39 } 40 41 template <typename T> 42 void BTTraveller<T>::preOrder(BSTNode<T> *node, std::deque<T> &out) 43 { 44 if(node) 45 { 46 out.push_back(node->key); 47 preOrder(node->left, out); 48 preOrder(node->right, out); 49 } 50 } 51 52 template <typename T> 53 void BTTraveller<T>::postOrder(BSTNode<T> *node, std::deque<T> &out) 54 { 55 if(node) 56 { 57 postOrder(node->left, out); 58 postOrder(node->right, out); 59 out.push_back(node->key); 60 } 61 } 62 63 template <typename T> 64 void BTTraveller<T>::levelOrder(std::deque<BSTNode<T>*> &hQ, std::deque<T> &out) 65 { 66 while(hQ.empty() == false) 67 { 68 BSTNode<T> *current = hQ.front(); 69 if(current != NULL) 70 { 71 hQ.pop_front(); 72 out.push_back(current->key); 73 addChildren(current, hQ); 74 } 75 } 76 } 77 78 template <typename T> 79 void BTTraveller<T>::addChildren(BSTNode<T> *node, std::deque<BSTNode<T>*> &hQ) 80 { 81 if(node->left != NULL) 82 { 83 hQ.push_back(node->left); 84 } 85 if(node->right != NULL) 86 { 87 hQ.push_back(node->right); 88 } 89 } 90 } You need to include BTTraveller class as a friend class in both the BSTNode as well as BST class declarations. This ensures that the BTTraveller class has access to private data members of these two classesThe BSTNode class 1 #ifndef _BSTNode_H_ 2 #define _BSTNode_H_ 3 #include <iostream> 4 5 //File: BSTNode.h 6 namespace algorithms 7 { 8 template <typename T> 9 class BST; 10 11 template <typename T> 12 class BTTraveller; 13 14 template <typename T> 15 class BSTNode 16 { 17 public: 18 BSTNode(T key); 19 ~BSTNode(); 20 21 friend class BST<T>; 22 friend class BTTraveller<T>; 23 24 private: 25 BSTNode<T> *left; 26 BSTNode<T> *right; 27 T key; 28 }; 29 }; 30 31 #include "BSTNode.hpp" 32 #endif //_BSTNode_H_ The BST class 1 #ifndef _BinarySearchTree_H_ 2 #define _BinarySearchTree_H_ 3 #include "BSTNode.h" 4 5 //File: BST.h 6 namespace algorithms 7 { 8 template <typename T> 9 class BTTraveller; 10 11 template <typename T> 12 class BST 13 { 14 public: 15 BST(); 16 ~BST(); 17 18 //modifiers 19 void insert(T key); 20 void remove(T key); 21 void clear(); 22 23 //accessors 24 bool find(T key); 25 bool isEmpty() const; 26 27 friend class BTTraveller<T>; 28 29 private: 30 void remove(BSTNode<T> **node); 31 void clear(BSTNode<T> *node); 32 BSTNode<T>** find(BSTNode<T> **node, const T key); 33 BSTNode<T>** getSuccessor(BSTNode<T> **node); 34 BSTNode<T>* getNewNode(T key); 35 36 //instance fields 37 BSTNode<T> *m_root; 38 }; 39 }; 40 41 #include "BST.hpp" 42 #endif //_BinarySearchTree_H_ The BSTNode.hpp and BST.hpp files remains the same as in the postThe Client Program 1 #include "BST.h" 2 #include "BTTraveller.h" 3 #define MAX 20 4 using namespace algorithms; 5 6 //File: Main.cpp 7 8 template <typename T> 9 void DumpDeque(std::deque<T> &q) 10 { 11 std::cout << std::endl; 12 std::deque<T>::const_iterator itr; 13 for(itr = q.cbegin(); itr != q.cend(); ++itr) 14 { 15 std::cout << *itr << " "; 16 } 17 std::cout << std::endl; 18 q.clear(); 19 } 20 21 int main(int argc, char *argv[]) 22 { 23 int nodes[MAX] = { 50, 40, 60, 70, 80, 20, 30, 10, 90, 15, 35, 65, 75, 5, 1, 100, 110, 130, 120, 111 }; 24 BST<int> bstInt; 25 for(int i = 0; i < MAX; ++i) 26 { 27 bstInt.insert(nodes[i]); 28 } 29 30 std::deque<int> elems; 31 BTTraveller<int>::inOrder(&bstInt, elems); 32 DumpDeque(elems); 33 BTTraveller<int>::preOrder(&bstInt, elems); 34 DumpDeque(elems); 35 BTTraveller<int>::postOrder(&bstInt, elems); 36 DumpDeque(elems); 37 BTTraveller<int>::levelOrder(&bstInt, elems); 38 DumpDeque(elems); 39 40 return 0; 41 } Output $ ./BinarySearchTree.exe 1 5 10 15 20 30 35 40 50 60 65 70 75 80 90 100 110 111 120 130 50 40 20 10 5 1 15 30 35 60 70 65 80 75 90 100 110 130 120 111 1 5 15 10 35 30 20 40 65 75 111 120 130 110 100 90 80 70 60 50 50 40 60 20 70 10 30 65 80 5 15 35 75 90 1 100 110 130 120 111 Read more ... Dec 5, 2011A Binary Search Tree Example
A
Binary Tree is a tree where each node may have 0, 1 or 2 children and a Binary Search Tree is a binary tree with a special property that the value of node under discussion is less than all the nodes in its right subtree and greater than all the nodes in its left subtree.The programs below describes the three basic operations in a binary search tree viz. search, insert and remove 1. Searching a node template <typename T> BSTNode<T>** BST<T>::find(BSTNode<T> **node, const T key) { if(*node == NULL || (*node)->key == key) { return node; } else if((*node)->key > key) { return find(&(*node)->left, key); } else { return find(&(*node)->right, key); } } 2. Inserting a node template <typename T> void BST<T>::insert(T key) { BSTNode<T> **node = find(&m_root, key); if(*node == NULL) { *node = getNewNode(key); } } 3. Removing a node Removing a node from binary search tree is the trickiest of all the operations. There are three cases to be considered when removing a node from a binary search tree: Case 1. If both left and right child are null, the node can simply be deleted. Case 2. If only one of the right child or left child is null, the address of the node is set to point to the left child or the right child which ever is not null and the current node is deleted. Case 3. The complex of the three cases, if both left and right child are present. This requires finding the successor of the current node which is to be removed. template <typename T>
void BST<T>::remove(BSTNode<T> **node)
{
BSTNode<T> *old = *node;
if((*node)->left == NULL)
{
*node = (*node)->right;
delete old;
}
else if((*node)->right == NULL)
{
*node = (*node)->left;
delete old;
}
else
{
BSTNode<T> **successor = getSuccessor(node);
(*node)->key = (*successor)->key;
remove(successor);
}
}
Following is the complete example showing the implementation details of the search, find and remove operations in a binary search tree. The BST Node Class 1 #ifndef _BSTNode_H_ 2 #define _BSTNode_H_ 3 #include <iostream> 4 5 //File: BSTNode.h 6 namespace algorithms 7 { 8 template <typename T> 9 class BST; 10 11 template <typename T> 12 class BSTNode 13 { 14 public: 15 BSTNode(T key); 16 ~BSTNode(); 17 18 friend class BST<T>; 19 20 private: 21 BSTNode<T> *left; 22 BSTNode<T> *right; 23 T key; 24 }; 25 }; 26 27 #include "BSTNode.hpp" 28 #endif //_BSTNode_H_ 1 //File: BSTNode.hpp 2 namespace algorithms 3 { 4 template <typename T> 5 BSTNode<T>::BSTNode(T key) : left(0), right(0) 6 { 7 this->key = key; 8 } 9 10 template <typename T> 11 BSTNode<T>::~BSTNode() 12 { 13 } 14 } 15 The Binary Search Tree Class 1 #ifndef _BinarySearchTree_H_ 2 #define _BinarySearchTree_H_ 3 #include "BSTNode.h" 4 5 //File: BST.h 6 namespace algorithms 7 { 8 template <typename T> 9 class BST 10 { 11 public: 12 BST(); 13 ~BST(); 14 15 //modifiers 16 void insert(T key); 17 void remove(T key); 18 void clear(); 19 20 //accessors 21 bool find(T key); 22 bool isEmpty() const; 23 24 private: 25 void remove(BSTNode<T> **node); 26 void clear(BSTNode<T> *node); 27 BSTNode<T>** find(BSTNode<T> **node, const T key); 28 BSTNode<T>** getSuccessor(BSTNode<T> **node); 29 BSTNode<T>* getNewNode(T key); 30 31 //instance fields 32 BSTNode<T> *m_root; 33 }; 34 }; 35 36 #include "BST.hpp" 37 #endif //_BinarySearchTree_H_ 1 //File: BST.hpp 2 namespace algorithms 3 { 4 template <typename T> 5 BST<T>::BST() 6 { 7 m_root = 0; 8 } 9 10 template <typename T> 11 BST<T>::~BST() 12 { 13 clear(); 14 } 15 16 template <typename T> 17 void BST<T>::clear() 18 { 19 clear(m_root); 20 } 21 22 template <typename T> 23 void BST<T>::clear(BSTNode<T> *node) 24 { 25 if(node != NULL) 26 { 27 clear(node->left); 28 clear(node->right); 29 delete node; 30 } 31 } 32 33 template <typename T> 34 void BST<T>::insert(T key) 35 { 36 BSTNode<T> **node = find(&m_root, key); 37 if(*node == NULL) 38 { 39 *node = getNewNode(key); 40 } 41 } 42 43 template <typename T> 44 void BST<T>::remove(T key) 45 { 46 BSTNode<T> **node = find(&m_root, key); 47 remove(node); 48 } 49 50 template <typename T> 51 void BST<T>::remove(BSTNode<T> **node) 52 { 53 BSTNode<T> *old = *node; 54 if((*node)->left == NULL) 55 { 56 *node = (*node)->right; 57 delete old; 58 } 59 else if((*node)->right == NULL) 60 { 61 *node = (*node)->left; 62 delete old; 63 } 64 else 65 { 66 BSTNode<T> **successor = getSuccessor(node); 67 (*node)->key = (*successor)->key; 68 remove(successor); 69 } 70 } 71 72 template <typename T> 73 BSTNode<T>** BST<T>::getSuccessor(BSTNode<T> **node) 74 { 75 BSTNode<T> **tmp = &(*node)->left; 76 while((*tmp)->right != NULL) 77 { 78 tmp = &(*tmp)->right; 79 } 80 return tmp; 81 } 82 83 template <typename T> 84 bool BST<T>::find(const T key) 85 { 86 BSTNode<T> **pos = find(&m_root, key); 87 return *pos != NULL; 88 } 89 90 template <typename T> 91 bool BST<T>::isEmpty() const 92 { 93 return m_root == 0; 94 } 95 96 template <typename T> 97 BSTNode<T>** BST<T>::find(BSTNode<T> **node, const T key) 98 { 99 if(*node == NULL || (*node)->key == key) 100 { 101 return node; 102 } 103 else if((*node)->key > key) 104 { 105 return find(&(*node)->left, key); 106 } 107 else 108 { 109 return find(&(*node)->right, key); 110 } 111 } 112 113 template <typename T> 114 BSTNode<T>* BST<T>::getNewNode(T key) 115 { 116 BSTNode<T> *node = new BSTNode<T>(key); 117 if(node == NULL) 118 { 119 std::cerr << "ERROR: Insufficient Memory"; 120 std::cerr << std::endl; 121 } 122 return node; 123 } 124 } The Client Program for testing the BST code above 1 #include "BST.h" 2 #define MAX 20 3 using namespace algorithms; 4 5 //File: Main.cpp 6 int main(int argc, char *argv[]) 7 { 8 int nodes[MAX] = { 50, 40, 60, 70, 80, 20, 30, 10, 90, 15, 35, 65, 75, 5, 1, 100, 110, 130, 120 }; 9 BST<int> bstInt; 10 for(int i = 0; i < MAX; ++i) 11 { 12 bstInt.insert(nodes[i]); 13 } 14 15 std::cout << (bstInt.find(130) ? "true" : "false"); 16 bstInt.remove(50); 17 std::cout << (bstInt.find(50) ? "true" : "false"); 18 19 return 0; 20 } Output of the run $ ./BinarySearchTree.exe truefalse Read more ...
Subscribe to:
Posts
(
Atom
)
|