Reverse alternate levels of a perfect binary tree | GeeksforGeeks


Reverse alternate levels of a perfect binary tree | GeeksforGeeks
Given a Perfect Binary Tree, reverse the alternate level nodes of the binary tree.
Given tree: 
               a
            /     \
           b       c
         /  \     /  \
        d    e    f    g
       / \  / \  / \  / \
       h  i j  k l  m  n  o 

Modified tree:
          a
            /     \
           c       b
         /  \     /  \
        d    e    f    g
       / \  / \  / \  / \
      o  n m  l k  j  i  h 
perfect binary tree is a full binary tree in which all leaves have the same depth or same level.
simple solution is to do following steps.
1) Access nodes level by level.
2) If current level is odd, then store nodes of this level in an array.
3) Reverse the array and store elements back in tree.
tricky solution is to do two inorder traversals. Following are steps to be followed.
1) Traverse the given tree in inorder fashion and store all odd level nodes in an auxiliary array. For the above example given tree, contents of array become {h, i, b, j, k, l, m, c, n, o}
2) Reverse the array. The array now becomes {o, n, c, m, l, k, j, b, i, h}
3) Traverse the tree again inorder fashion. While traversing the tree, one by one take elements from array and store elements from array to every odd level traversed node.
    Node root;
    Index index_obj = new Index();
  
    // function to store alternate levels in a tree
    void storeAlternate(Node node, char arr[], Index index, int l) {
        // base case
        if (node == null) {
            return;
        }
        // store elements of left subtree
        storeAlternate(node.left, arr, index, l + 1);
  
        // store this node only if level is odd
        if (l % 2 != 0) {
            arr[index.index] = node.data;
            index.index++;
        }
  
        storeAlternate(node.right, arr, index, l + 1);
    }
  
    // Function to modify Binary Tree (All odd level nodes are
    // updated by taking elements from array in inorder fashion)
    void modifyTree(Node node, char arr[], Index index, int l) {
  
        // Base case
        if (node == null) {
            return;
        }
  
        // Update nodes in left subtree
        modifyTree(node.left, arr, index, l + 1);
  
        // Update this node only if this is an odd level node
        if (l % 2 != 0) {
            node.data = arr[index.index];
            (index.index)++;
        }
  
        // Update nodes in right subtree
        modifyTree(node.right, arr, index, l + 1);
    }
  
    // A utility function to reverse an array from index
    // 0 to n-1
    void reverse(char arr[], int n) {
        int l = 0, r = n - 1;
        while (l < r) {
            char temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            l++;
            r--;
        }
    }
  
    void reverseAlternate() {
        reverseAlternate(root);
    }
  
    // The main function to reverse alternate nodes of a binary tree
    void reverseAlternate(Node node) {
  
        // Create an auxiliary array to store nodes of alternate levels
        char[] arr = new char[100];
  
        // First store nodes of alternate levels
        storeAlternate(node, arr, index_obj, 0);
  
        //index_obj.index = 0;
          
        // Reverse the array
        reverse(arr, index_obj.index);
  
        // Update tree by taking elements from array
        index_obj.index = 0;
        modifyTree(node, arr, index_obj, 0);
    }

http://algorithms.tutorialhorizon.com/reverse-alternate-levels-of-a-given-binary-tree/
    public static ArrayList al;
    public void storeAlterNateLevels(Node root,int level){
        if(root!=null){
            storeAlterNateLevels(root.left,level+1);
            if(level%2!=0){
                al.add(root.data);
            }
            storeAlterNateLevels(root.right,level+1);
        }
    }
    public void reverseAlterNateLevels(Node root,int level){
        if(root!=null){
            reverseAlterNateLevels(root.left,level+1);
            if(level%2!=0){
                root.data = (Integer)al.remove(0);
            }
            reverseAlterNateLevels(root.right,level+1);
        }
    }
        i.storeAlterNateLevels(root,0);
        Collections.reverse(al);
        i.reverseAlterNateLevels(root,0);
https://learn.hackerearth.com/tutorial/trees/105/reverse-alternate-levels-of-a-fullperfect-binary-t/
   1.Do level order traversal.Following are steps to be followed.
   2.Initially take a variable level and initialize with 1.
   3.Push root and NULL in a queue, root's left and right child in a stack.
   4.Now iterate over a loop while queue is not empty:
    4.a Pop element from queue and store in a temp variable.
       4.a.1 If poped element is NULL and queue is not empty,it
            indicates that and of level and we will push a NULL.
       4.b if level is odd :
           4.b.1 Poped stack's top element and add to left of temp.
           4.b.2 Poped one more element and add to right of temp.
           4.b.3 Now we altered the reference so we have to arrange left
            and right sub-tree of altered nodes.
                Just replace left of Left subtree to left of right Subtree.
                Replace right of Left subtree to right of Right subtree.
               4.b.4 push temp's left and temp's right to the queue.
       4.c if level is even :
          4.c.1 Push temp->left's left and right child to the stack.
          4.c.2 similarly for temp->right's children.

void alterNodes(struct node *root){
    if(root == NULL)
      return ;
    queue<struct node*>q;
    stack<struct node*>s;
    int level = 1;
    struct node *temp,*Left,*Right,*rev;
    q.push(root);
    q.push(NULL);         //end of level
    s.push(root->left);
    s.push(root->right);
    while(!q.empty())
    {
            temp = q.front();
            q.pop();
            if(temp == NULL)
            {
                    if(!q.empty())
                    q.push(NULL);
                    level++;
            }
            else
            {
                    if(level%2)                //odd level
                    {
                            temp->left = s.top();
                            s.pop();
                            temp->right = s.top();
                            s.pop();
                            Left = temp->left;
                            Right = temp->right;

                            rev = Left->left;            //adjust left subtree
                            Left->left = Right->left;
                            Right->left = rev;

                            rev = Left->right;           //adjust right subtree
                            Left->right = Right->right;
                            Right->right = rev;

                    }
                    if(temp->left)
                    q.push(temp->left);
                    if(temp->right)
                    q.push(temp->right);

                    if(level%2==0)                    //even level
                    {
                            if(temp->left)
                            {
                                    s.push(temp->left->left);
                                    s.push(temp->left->right);
                            }
                            if(temp->right)
                            {
                                    s.push(temp->right->left);
                                    s.push(temp->right->right);
                            }
                    }
            }
    }
}
http://www.njiang.cn/2014/07/12/reverse-alternate-levels-of-a-perfect-binary-tree/
void traverseNode(struct Node* root, int level, vector<vector<int> >& lists)
{
if (root == NULL) {
return;
}
if (lists.size() < level + 1) {
lists.push_back(vector<int>());
}
lists[level].push_back(root->data);
traverseNode(root->left, level+1, lists);
traverseNode(root->right, level+1, lists);
}
void replaceNode(struct Node* root, int level, vector<vector<int> >& lists)
{
if (root == NULL) {
return;
}
if (lists[level].size() == 0) {
return;
}
if (level%2 != 0) {
size_t count = lists[level].size();
root->data = lists[level][count - 1];
lists[level].pop_back();
}
replaceNode(root->left, level+1, lists);
replaceNode(root->right, level+1, lists);
}
void reverseTree(struct Node* root)
{
if (root == NULL) {
return;
}
vector<vector<int> > lists;
traverseNode(root, 0, lists);
replaceNode(root, 0, lists);
}
Read full article from Reverse alternate levels of a perfect binary tree | GeeksforGeeks

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts