From d5de0f9d5db0d394374b1a2f499bfea81bfa4f61 Mon Sep 17 00:00:00 2001 From: Sanchit Thacker Date: Sat, 28 Oct 2017 02:01:49 +0530 Subject: [PATCH] Diagonal Traversal of Binary Tree --- .../Diagonal_Traversal_of_BinaryTree | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 C++ Questions/Diagonal_Traversal_of_BinaryTree diff --git a/C++ Questions/Diagonal_Traversal_of_BinaryTree b/C++ Questions/Diagonal_Traversal_of_BinaryTree new file mode 100644 index 0000000..3f79942 --- /dev/null +++ b/C++ Questions/Diagonal_Traversal_of_BinaryTree @@ -0,0 +1,89 @@ +#include +using namespace std; + +// Tree node +struct Node +{ + int data; + Node *left, *right; +}; + +/* root - root of the binary tree + d - distance of current line from rightmost + -topmost slope. + diagonalPrint - multimap to store Diagonal + elements (Passed by Reference) */ +void diagonalPrintUtil(Node* root, int d, + map> &diagonalPrint) +{ + // Base case + if (!root) + return; + + // Store all nodes of same line together as a vector + diagonalPrint[d].push_back(root->data); + + // Increase the vertical distance if left child + diagonalPrintUtil(root->left, d + 1, diagonalPrint); + + // Vertical distance remains same for right child + diagonalPrintUtil(root->right, d, diagonalPrint); +} + +// Print diagonal traversal of given binary tree +void diagonalPrint(Node* root) +{ + // create a map of vectors to store Diagonal elements + map > diagonalPrint; + diagonalPrintUtil(root, 0, diagonalPrint); + + cout << "Diagonal Traversal of binary tree : n"; + for (auto it = diagonalPrint.begin(); + it != diagonalPrint.end(); ++it) + { + for (auto itr = it->second.begin(); + itr != it->second.end(); ++itr) + cout << *itr << ' '; + + cout << 'n'; + } +} + +// Utility method to create a new node +Node* newNode(int data) +{ + Node* node = new Node; + node->data = data; + node->left = node->right = NULL; + return node; +} + +// Driver program +int main() +{ + Node* root = newNode(8); + root->left = newNode(3); + root->right = newNode(10); + root->left->left = newNode(1); + root->left->right = newNode(6); + root->right->right = newNode(14); + root->right->right->left = newNode(13); + root->left->right->left = newNode(4); + root->left->right->right = newNode(7); + + /* Node* root = newNode(1); + root->left = newNode(2); + root->right = newNode(3); + root->left->left = newNode(9); + root->left->right = newNode(6); + root->right->left = newNode(4); + root->right->right = newNode(5); + root->right->left->right = newNode(7); + root->right->left->left = newNode(12); + root->left->right->left = newNode(11); + root->left->left->right = newNode(10);*/ + + diagonalPrint(root); + + return 0; +}