#include <iostream> #include <string.h> using namespace std; int max(int p, int q) { return ((p>q) ? p : q); } int max3(int p, int q, int r) { return ((p>q) ? (p>r? p:r) : (q>r ? q:r)); } class node; class node { public: char c; node* l; node* r; }; void insert(node** root, char c) { if(!(*root)) { node* t = new node(); t->c = c; t->l=NULL; t->r=NULL; *root = t; //cout << "root=" << (*root)->c << endl; } else { if((*root)->c > c) { if(!(*root)->l) { node* t = new node(); t->c = c; t->l=NULL; t->r=NULL; (*root)->l = t; //cout << "left=" << (*root)->l->c << endl; } else insert(&((*root)->l), c); } else { if(!(*root)->r) { node* t = new node(); t->c = c; t->l=NULL; t->r=NULL; (*root)->r = t; //cout << "right=" << (*root)->r->c << endl; } else insert(&((*root)->r), c); } } } void printinorder(node* root) { if(!root) { return; } printinorder(root->l); cout << root->c << " "; printinorder(root->r); } int depth(node* root) { if(!root) return 0; return 1 + max(depth(root->l), depth(root->r)); } void printaltbylevel(node* root, int depth, int level) { if(!root) return; if(depth == level) { cout << root->c; } else { if(depth%2 == 0) { printaltbylevel(root->l, depth, level+1); printaltbylevel(root->r, depth, level+1); } else { printaltbylevel(root->r, depth, level+1); printaltbylevel(root->l, depth, level+1); } } } void printbylevel(node* root, int depth, int level) { if(!root) return; if(depth == level) { cout << root->c; } else { printbylevel(root->l, depth, level+1); cout<<" "; printbylevel(root->r, depth, level+1); } } void printlevelorder(node *root) { int d = depth(root); for(int i=0; i<d; i++) { for(int j=0;j<d-i;j++) cout << " "; printbylevel(root, i, 0); cout << endl; } } void printaltlevelorder(node *root) { int d = depth(root); for(int i=0; i<d; i++) { printaltbylevel(root, i, 0); } } int diameter(node* root) { if(!root) return 0; int lheight = depth(root->l); int rheight = depth(root->r); return (1 + max3(lheight + rheight, diameter(root->l), diameter(root->r))); } int main() { // your code goes here char s[100]; cin >> s; node* root=NULL; for(int i=0; i<strlen(s);i++) insert(&root, s[i]); cout << "tree input is:" << s << endl; cout << "inorder: "; printinorder(root); cout << "\ntree depth=" << depth(root) << endl; cout << "level order: \n"; printlevelorder(root); cout << "alt level order: \n"; printaltlevelorder(root); cout << "\ndiameter of tree: " << diameter(root) <<endl; return 0; } tree input is:jfmcnabkd inorder: a b c d f j k m n tree depth=5 level order: j f m c k n a d b alt level order: jmfckndab diameter of tree: 7
This blog site is dedicated for articles on problem solving using C, C++, data structures, algorithms. Besides this few technical articles are also presented.
Jun 25, 2017
Tree traversal and diameter
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment