Iterative Boundary traversal of Complete Binary tree

Given a complete binary tree, traverse it such that all the boundary nodes are visited in Anti-Clockwise order starting from the root.

Example:

Input:
               18
           /       \  
         15         30  
        /  \        /  \
      40    50    100   20
Output: 18 15 40 50 100 20 30

Approach:

  • Traverse left-most nodes of the tree from top to down. (Left boundary)
  • Traverse bottom-most level of the tree from left to right. (Leaf nodes)
  • Traverse right-most nodes of the tree from bottom to up. (Right boundary)

We can traverse the left boundary quite easily with the help of a while loop that checks when the node doesn’t have any left child. Similarly, we can traverse the right boundary quite easily with the help of a while loop that checks when the node doesn’t have any right child.

The main challenge here is to traverse the last level of the tree in left to right order. To traverse level-wise there is BFS and order of left to right can be taken care of by pushing left nodes in the queue first. So the only thing left now is to make sure it is the last level. Just check whether the node has any child and only include them.
We will have to take special care of the corner case that same nodes are not traversed again. In the example above 40 is a part of the left boundary as well as leaf nodes. Similarly, 20 is a part of the right boundary as well as leaf nodes.
So we will have to traverse only till the second last node of both the boundaries in that case. Also keep in mind we should not traverse the root again.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
/* A binary tree node has data, pointer
   to left child and a pointer to right 
   child */
struct Node {
    int data;
    struct Node *left, *right;
};
  
/* Helper function that allocates a new 
   node with the given data and NULL left 
   and right pointers. */
struct Node* newNode(int data)
{
    Node* temp = new Node;
  
    temp->data = data;
    temp->left = temp->right = NULL;
  
    return temp;
}
  
// Function to print the  nodes of a 
// binary tree in boundary traversal order
void boundaryTraversal(Node* root)
{
    if (root) {
  
        // If there is only 1 node print it
        // and return
        if (!(root->left) && !(root->right)) {
            cout << root->data << endl;
            return;
        }
  
        // List to store order of traversed
        // nodes
        vector<Node*> list;
        list.push_back(root);
  
        // Traverse left boundary without root
        // and last node
        Node* L = root->left;
        while (L->left) {
            list.push_back(L);
            L = L->left;
        }
  
        // BFS designed to only include leaf nodes
        queue<Node*> q;
        q.push(root);
        while (!q.empty()) {
            Node* temp = q.front();
            q.pop();
            if (!(temp->left) && !(temp->right)) {
                list.push_back(temp);
            }
            if (temp->left) {
                q.push(temp->left);
            }
            if (temp->right) {
                q.push(temp->right);
            }
        }
  
        // Traverse right boundary without root
        // and last node
        vector<Node*> list_r;
        Node* R = root->right;
        while (R->right) {
            list_r.push_back(R);
            R = R->right;
        }
  
        // Reversing the order
        reverse(list_r.begin(), list_r.end());
  
        // Concatenating the two lists
        list.insert(list.end(), list_r.begin(),
                                 list_r.end());
  
        // Printing the node's data from the list
        for (auto i : list) {
            cout << i->data << " ";
        }
        cout << endl;
        return;
    }
}
  
// Driver code
int main()
{
  
    // Root node of the tree
    Node* root = newNode(20);
  
    root->left = newNode(8);
    root->right = newNode(22);
  
    root->left->left = newNode(4);
    root->left->right = newNode(12);
  
    root->left->right->left = newNode(10);
    root->left->right->right = newNode(14);
  
    root->right->right = newNode(25);
  
    boundaryTraversal(root);
  
    return 0;
}

chevron_right


Output:

20 8 4 25 10 14 22


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.