fork download
  1. #include <algorithm>
  2. #include <iostream>
  3. using std::cout;
  4.  
  5. struct Node
  6. {
  7. char key;
  8. Node *left, *right;
  9. };
  10.  
  11. void preorder(struct Node *root1, struct Node* root2, int lvl)
  12. {
  13. // Base cases
  14. if (root1 == NULL || root2==NULL)
  15. return;
  16.  
  17. // Swap subtrees if level is even
  18. if (lvl%2 == 0)
  19. std::swap(root1->key, root2->key);
  20.  
  21. // Recur for left and right subtrees (Note : left of root1
  22. // is passed and right of root2 in first call and opposite
  23. // in second call.
  24. preorder(root1->left, root2->right, lvl+1);
  25. preorder(root1->right, root2->left, lvl+1);
  26. }
  27.  
  28. // This function calls preorder() for left and right children
  29. // of root
  30. void reverseAlternate(struct Node *root)
  31. {
  32. preorder(root->left, root->right, 0);
  33. }
  34.  
  35. // Inorder traversal (used to print initial and
  36. // modified trees)
  37. void printInorder(struct Node *root)
  38. {
  39. if (root == NULL)
  40. return;
  41. printInorder(root->left);
  42. cout << root->key << " ";
  43. printInorder(root->right);
  44. }
  45.  
  46. // A utility function to create a new node
  47. Node *newNode(int key)
  48. {
  49. Node *temp = new Node;
  50. temp->left = temp->right = NULL;
  51. temp->key = key;
  52. return temp;
  53. }
  54.  
  55. // Driver program to test above functions
  56. int main()
  57. {
  58. struct Node *root = newNode('a');
  59. root->left = newNode('b');
  60. root->right = newNode('c');
  61. root->left->left = newNode('d');
  62. root->left->right = newNode('e');
  63. root->right->left = newNode('f');
  64. root->right->right = newNode('g');
  65. root->left->left->left = newNode('h');
  66. root->left->left->right = newNode('i');
  67. root->left->right->left = newNode('j');
  68. root->left->right->right = newNode('k');
  69. root->right->left->left = newNode('l');
  70. root->right->left->right = newNode('m');
  71. root->right->right->left = newNode('n');
  72. root->right->right->right = newNode('o');
  73.  
  74. cout << "Inorder Traversal of given tree\n";
  75. printInorder(root);
  76. reverseAlternate(root);
  77. cout << "\n\nInorder Traversal of modified tree\n";
  78. printInorder(root);
  79. cout << '\n';
  80. return 0;
  81. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
Inorder Traversal of given tree
h d i b j e k a l f m c n g o 

Inorder Traversal of modified tree
o d n c m e l a k f j b i g h