Detecting loop in a linked list
August 10, 2012
Kadane's Algorithm to find maximum subarray sum
August 19, 2012

check if all nodes of a tree has only one child

Given the PreOrder traversal of a binary search tree (in the form of a tree), check if all the nodes (except the last) of the tree has exactly one child.

For Example: If the Preorder traversal of the tree is given as below:

{50, 25, 45, 30, 27, 29}

The the output should be: TRUE
Because Binary Search Tree represented by the above traversal is shown on the right.
In the tree, EACH NON-LEAF NODE HAS EXACTLY ONE CHILD.

Solution:

In preorder traversal, we first visit the Root Node then the left Sub-tree and then right sub-tree. So all the descendants of a Node appears on the right in the pre-order traversal.

If a particular Node has only one child, then all the descendants are either on the Right sub-tree or left sub-tree. Hence the descendants are either All greater than the Node, or ALL less than the Node.

Now there can be multiple methods to check this thing (if descendents are either all greater than this or all les than this) in the array:

1. Brute-Force (Using two loops) – O(n2) time 

bool checkTree(int *arr, int n)
{
    bool larger;
    for(int i=0; i<n-1; i++)
    {
        if(arr[i+1] > arr[i])
            larger = true;
        else
            larger = false;
        for(int j=i+1; j<n; j++)
            if( (larger && arr[j] < arr[i]) || (!larger && arr[j] > arr[i]) )
                return false;
    }
    return true;
}

2. Using max-min pointers – O(n) time

1. Make min & max point last element.
    min = max = n-1
2. for(i=n-2; i>=0; i--)
    arr[i] should be less than current min or greater than current max.

Code:

bool checkTree2(int *arr, int n)
{
    int min, max;
    min = max = n-1;
    for(int i=n-2; i>=0; i--)
        if(arr[i] < arr[min])
            min = i;
        else if(arr[i] > arr[max])
            max = i;
        else
            return false;
    return true;
}

2 Comments

  1. abc says:

    {50, 25, 45, 30, 27,26, 29} also satisfy your algorithm but is not the tree with all nodes having child

    • abc says:

      modifying statement:
      {50, 25, 45, 30, 27,26, 29} also satisfy your algorithm but is not the tree with all nodes except last having only one child

Leave a Reply

Your email address will not be published. Required fields are marked *