Check if each internal node of a BST has exactly one child

17 Jun, 2022
Given Preorder traversal of a BST, check if each non-leaf node has only one child. Assume that the BST contains unique entries.
Examples :
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
Input: pre[] = {20, 10, 11, 13, 12}
Output: Yes
The given array represents following BST. In the following BST, every internal
node has exactly 1 child. Therefore, the output is true.
        20
       /
      10
       \
        11
          \
           13
           /
         12
In Preorder traversal, descendants (or Preorder successors) of every node appear after the node. In the above example, 20 is the first node in preorder and all descendants of 20 appear after it. All descendants of 20 are smaller than it. For 10, all descendants are greater than it. In general, we can say, if all internal nodes have only one child in a BST, then all the descendants of every node are either smaller or larger than the node. The reason is simple, since the tree is BST and every node has only one child, all descendants of a node will either be on left side or right side, means all descendants will either be smaller or greater.
Approach 1 (Naive):This approach simply follows the above idea that all values on right side are either smaller or larger. Use two loops, the outer loop picks an element one by one, starting from the leftmost element. The inner loop checks if all elements on the right side of the picked element are either smaller or greater. The time complexity of this method will be O(n^2).
Approach 2:Since all the descendants of a node must either be larger or smaller than the node. We can do following for every node in a loop. 
Find the next preorder successor (or descendant) of the node. Find the last preorder successor (last element in pre[]) of the node. If both successors are less than the current node, or both successors are greater than the current node, then continue. Else, return false. 
Find the next preorder successor (or descendant) of the node. 
Find the last preorder successor (last element in pre[]) of the node. 
If both successors are less than the current node, or both successors are greater than the current node, then continue. Else, return false. 
C++
C
Java
Python3
C#
Javascript
#include<bits/stdc++.h>using namespace std;  bool hasOnlyOneChild(int pre[], int size){    int nextDiff, lastDiff;      for (int i=0; i<size-1; i++)    {        nextDiff = pre[i] - pre[i+1];        lastDiff = pre[i] - pre[size-1];        if (nextDiff*lastDiff < 0)            return false;;    }    return true;}  // driver program to test above functionint main(){    int pre[] = {8, 3, 5, 7, 6};    int size = sizeof(pre)/sizeof(pre[0]);    if (hasOnlyOneChild(pre, size) == true )        cout<<"Yes";    else        cout<<"No";    return 0;}  // This code is contributed by rrrtnx.
#include <stdio.h>  bool hasOnlyOneChild(int pre[], int size){    int nextDiff, lastDiff;      for (int i=0; i<size-1; i++)    {        nextDiff = pre[i] - pre[i+1];        lastDiff = pre[i] - pre[size-1];        if (nextDiff*lastDiff < 0)            return false;;    }    return true;}  // driver program to test above functionint main(){    int pre[] = {8, 3, 5, 7, 6};    int size = sizeof(pre)/sizeof(pre[0]);    if (hasOnlyOneChild(pre, size) == true )        printf("Yes");    else        printf("No");    return 0;}
// Check if each internal node of BST has only one child  class BinaryTree {      boolean hasOnlyOneChild(int pre[], int size) {        int nextDiff, lastDiff;          for (int i = 0; i < size - 1; i++) {            nextDiff = pre[i] - pre[i + 1];            lastDiff = pre[i] - pre[size - 1];            if (nextDiff * lastDiff < 0) {                return false;            };        }        return true;    }      public static void main(String[] args) {        BinaryTree tree = new BinaryTree();        int pre[] = new int[]{8, 3, 5, 7, 6};        int size = pre.length;        if (tree.hasOnlyOneChild(pre, size) == true) {            System.out.println("Yes");        } else {            System.out.println("No");        }    }}  // This code has been contributed by Mayank Jaiswal
# Check if each internal# node of BST has only one child  def hasOnlyOneChild (pre, size):    nextDiff=0; lastDiff=0       for i in range(size-1):        nextDiff = pre[i] - pre[i+1]        lastDiff = pre[i] - pre[size-1]        if nextDiff*lastDiff < 0:            return False    return True   # driver program to# test above functionif __name__ == "__main__":      pre = [8, 3, 5, 7, 6]    size= len(pre)      if (hasOnlyOneChild(pre,size) == True):        print("Yes")    else:        print("No")  # This code is contributed by# Harshit Saini 
// Check if each internal node of BST has only one childusing System;public class BinaryTree{    bool hasOnlyOneChild(int[] pre, int size)   {    int nextDiff, lastDiff;    for (int i = 0; i < size - 1; i++)    {      nextDiff = pre[i] - pre[i + 1];      lastDiff = pre[i] - pre[size - 1];      if (nextDiff * lastDiff < 0)      {        return false;      };    }    return true;  }    // Driver code  public static void Main(String[] args)   {    BinaryTree tree = new BinaryTree();    int []pre = new int[]{8, 3, 5, 7, 6};    int size = pre.Length;    if (tree.hasOnlyOneChild(pre, size) == true)     {      Console.WriteLine("Yes");    }     else    {      Console.WriteLine("No");    }  }}  // This code is contributed by aashish1995
<script>   // Check if each internal node of BST has only one childfunction hasOnlyOneChild(pre, size) {  var nextDiff, lastDiff;  for (var i = 0; i < size - 1; i++)  {    nextDiff = pre[i] - pre[i + 1];    lastDiff = pre[i] - pre[size - 1];    if (nextDiff * lastDiff < 0)    {      return false;    };  }  return true;}  // Driver codevar pre = [8, 3, 5, 7, 6];var size = pre.length;if (hasOnlyOneChild(pre, size) == true) {  document.write("Yes");} else{  document.write("No");}  // This code is contributed by itsok.</script>
Yes
Approach 3 :
Scan the last two nodes of preorder & mark them as min & max. Scan every node down the preorder array. Each node must be either smaller than the min node or larger than the max node. Update min & max accordingly.  
Scan the last two nodes of preorder & mark them as min & max. 
Scan every node down the preorder array. Each node must be either smaller than the min node or larger than the max node. Update min & max accordingly.  
C++
C
Java
Python3
C#
Javascript
#include <bits/stdc++.h>using namespace std;  int hasOnlyOneChild(int pre[], int size){          // Initialize min and max using last two elements    int min, max;    if (pre[size - 1] > pre[size - 2])    {        max = pre[size - 1];        min = pre[size - 2];    }    else    {        max = pre[size - 2];        min = pre[size - 1];    }      // Every element must be either smaller    // than min or greater than max    for(int i = size - 3; i >= 0; i--)    {        if (pre[i] < min)            min = pre[i];        else if (pre[i] > max)            max = pre[i];        else            return false;    }    return true;}  // Driver codeint main(){    int pre[] = { 8, 3, 5, 7, 6 };    int size = sizeof(pre) / sizeof(pre[0]);          if (hasOnlyOneChild(pre,size))        cout <<"Yes";    else        cout <<"No";              return 0;}  // This code is contributed by shivanisinghss2110
#include <stdio.h>  int hasOnlyOneChild(int pre[], int size){    // Initialize min and max using last two elements    int min, max;    if (pre[size-1] > pre[size-2])    {        max = pre[size-1];        min = pre[size-2];    }    else    {        max = pre[size-2];        min = pre[size-1];    }        // Every element must be either smaller than min or    // greater than max    for (int i=size-3; i>=0; i--)    {        if (pre[i] < min)            min = pre[i];        else if (pre[i] > max)            max = pre[i];        else            return false;    }    return true;}  // Driver program to test above functionint main(){    int pre[] = {8, 3, 5, 7, 6};    int size = sizeof(pre)/sizeof(pre[0]);    if (hasOnlyOneChild(pre,size))        printf("Yes");    else        printf("No");    return 0;}
// Check if each internal node of BST has only one child  class BinaryTree {      boolean hasOnlyOneChild(int pre[], int size) {        // Initialize min and max using last two elements        int min, max;        if (pre[size - 1] > pre[size - 2]) {            max = pre[size - 1];            min = pre[size - 2];        } else {            max = pre[size - 2];            min = pre[size - 1];        }          // Every element must be either smaller than min or        // greater than max        for (int i = size - 3; i >= 0; i--) {            if (pre[i] < min) {                min = pre[i];            } else if (pre[i] > max) {                max = pre[i];            } else {                return false;            }        }        return true;    }      public static void main(String[] args) {        BinaryTree tree = new BinaryTree();        int pre[] = new int[]{8, 3, 5, 7, 6};        int size = pre.length;        if (tree.hasOnlyOneChild(pre, size) == true) {            System.out.println("Yes");        } else {            System.out.println("No");        }    }}  // This code has been contributed by Mayank Jaiswal
# Check if each internal# node of BST has only one child# approach 2  def hasOnlyOneChild(pre,size):      # Initialize min and max    # using last two elements    min=0; max=0      if pre[size-1] > pre[size-2] :        max = pre[size-1]        min = pre[size-2]    else :        max = pre[size-2]        min = pre[size-1]        # Every element must be    # either smaller than min or    # greater than max    for i in range(size-3, 0, -1):        if pre[i] < min:            min = pre[i]        elif pre[i] > max:            max = pre[i]        else:            return False    return True   # Driver program to# test above functionif __name__ == "__main__":      pre = [8, 3, 5, 7, 6]      size = len(pre)    if (hasOnlyOneChild(pre, size)):        print("Yes")    else:        print("No")  # This code is contributed by# Harshit Saini 
// Check if each internal node of BST has only one childusing System;public class BinaryTree {    bool hasOnlyOneChild(int []pre, int size)  {      // Initialize min and max using last two elements    int min, max;    if (pre[size - 1] > pre[size - 2]) {      max = pre[size - 1];      min = pre[size - 2];    } else {      max = pre[size - 2];      min = pre[size - 1];    }      // Every element must be either smaller than min or    // greater than max    for (int i = size - 3; i >= 0; i--) {      if (pre[i] < min) {        min = pre[i];      } else if (pre[i] > max) {        max = pre[i];      } else {        return false;      }    }    return true;  }    // Driver code  public static void Main(String[] args)   {    BinaryTree tree = new BinaryTree();    int []pre = new int[]{8, 3, 5, 7, 6};    int size = pre.Length;    if (tree.hasOnlyOneChild(pre, size) == true)     {      Console.WriteLine("Yes");    }     else    {      Console.WriteLine("No");    }  }}  // This code is contributed by aashish1995
<script>        // Check if each internal node of BST      // has only one child      class BinaryTree {        hasOnlyOneChild(pre, size) {          // Initialize min and max using           // last two elements          var min, max;          if (pre[size - 1] > pre[size - 2]) {            max = pre[size - 1];            min = pre[size - 2];          } else {            max = pre[size - 2];            min = pre[size - 1];          }            // Every element must be either          // smaller than min or          // greater than max          for (var i = size - 3; i >= 0; i--) {            if (pre[i] < min) {              min = pre[i];            } else if (pre[i] > max) {              max = pre[i];            } else {              return false;            }          }          return true;        }      }      // Driver code      var tree = new BinaryTree();      var pre = [8, 3, 5, 7, 6];      var size = pre.length;      if (tree.hasOnlyOneChild(pre, size) == true) {        document.write("Yes");      } else {        document.write("No");      }        </script>
Yes
aashish1995
hritikbhatnagar2182
rrrtnx
itsok
rdtank
shivanisinghss2110
hardikkoriintern
Binary Search Tree
Binary Search Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.