Check whether a given binary tree is skewed binary tree or not?

Given a Binary Tree check whether it is skewed binary tree or not. A skewed tree is a tree where each node has only one child node or none.

Examples:

Input :         5
             /   
            4
              \
               3
             /
           2
Output : Yes

Input :       5
            /
           4
            \
             3
           /  \
          2    4
Output : No


The idea is to check if a node has two children. If node has two children return false, else recursively compute whether subtree with one child is skewed tree. If node is leaf node return true.

Below is the implementation of above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to Check whether a given 
// binary tree is skewed binary tree or not?
  
#include <bits/stdc++.h>
using namespace std;
  
// A Tree node
struct Node {
    int key;
    struct Node *left, *right;
};
  
// Utility function to create a new node
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return (temp);
}
  
bool isSkewedBT(Node* root)
{
    // check if node is NULL or is a leaf node
    if (root == NULL || (root->left == NULL && 
                        root->right == NULL))
        return true;
  
    // check if node has two children if
    // yes, return false
    if (root->left && root->right) 
        return false;
    if (root->left)
        return isSkewedBT(root->left);
    return isSkewedBT(root->right);
}
  
// Driver program
int main()
{
    /*   10
       /     \
     12       13
           /     \
         14       15    
        /   \     /  \
       21   22   23   24           
    Let us create Binary Tree shown in above example */
    Node* root = newNode(10);
    root->left = newNode(12);
    root->left->right = newNode(15);
    cout << isSkewedBT(root) << endl;
  
    root = newNode(5);
    root->right = newNode(4);
    root->right->left = newNode(3);
    root->right->left->right = newNode(2);
    cout << isSkewedBT(root) << endl;
  
    root = newNode(5);
    root->left = newNode(4);
    root->left->right = newNode(3);
    root->left->right->left = newNode(2);
    root->left->right->right = newNode(4);
    cout << isSkewedBT(root) << endl;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to Check whether a given 
// binary tree is skewed binary tree or not?
  
class Solution
{
// A Tree node 
 static class Node { 
    int key; 
     Node left, right; 
}
  
// Utility function to create a new node 
static Node newNode(int key) 
    Node temp = new Node(); 
    temp.key = key; 
    temp.left = temp.right = null
    return (temp); 
  
static boolean isSkewedBT(Node root) 
    // check if node is null or is a leaf node 
    if (root == null || (root.left == null && 
                        root.right == null)) 
        return true
  
    // check if node has two children if 
    // yes, return false 
    if (root.left!=null && root.right!=null
        return false
    if (root.left!=null
        return isSkewedBT(root.left); 
    return isSkewedBT(root.right); 
  
// Driver program 
public static void main(String args[])
    /* 10 
    /     \ 
    12     13 
        /     \ 
        14     15     
        / \     / \ 
    21 22 23 24         
    Let us create Binary Tree shown in above example */
    Node root = newNode(10); 
    root.left = newNode(12); 
    root.left.right = newNode(15); 
    System.out.println( isSkewedBT(root)?1:0 ); 
  
    root = newNode(5); 
    root.right = newNode(4); 
    root.right.left = newNode(3); 
    root.right.left.right = newNode(2); 
    System.out.println( isSkewedBT(root)?1:0 ); 
  
    root = newNode(5); 
    root.left = newNode(4); 
    root.left.right = newNode(3); 
    root.left.right.left = newNode(2); 
    root.left.right.right = newNode(4); 
    System.out.println(  isSkewedBT(root)?1:0 ); 
}
//contributed by Arnab Kundu

chevron_right


Python3

# Python3 program to Check whether a given
# binary tree is skewed binary tree or not?

# Binary Tree Node
“”” utility that allocates a newNode
with the given key “””
class newNode:

# Construct to create a newNode
def __init__(self, key):
self.data = key
self.left = None
self.right = None

def isSkewedBT(root):

# check if node is None or is a leaf node
if (root == None or (root.left == None and
root.right == None)):
return 1

# check if node has two children if
# yes, return false
if (root.left and root.right):
return 0
if (root.left) :
return isSkewedBT(root.left)
return isSkewedBT(root.right)

# Driver Code
if __name__ == ‘__main__’:

“”” 10
/ \
12 13
/ \
14 15
/ \ / \
21 22 23 24
Let us create Binary Tree shown in above example “””
root = newNode(10)
root.left = newNode(12)
root.left.right = newNode(15)
print(isSkewedBT(root))

root = newNode(5)
root.right = newNode(4)
root.right.left = newNode(3)
root.right.left.right = newNode(2)
print(isSkewedBT(root))

root = newNode(5)
root.left = newNode(4)
root.left.right = newNode(3)
root.left.right.left = newNode(2)
root.left.right.right = newNode(4)
print(isSkewedBT(root))

# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)

C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to Check whether a given 
// binary tree is skewed binary tree or not? 
using System;
  
public class GFG 
      
// A Tree node 
class Node 
    public int key; 
    public Node left, right; 
  
// Utility function to create a new node 
static Node newNode(int key) 
    Node temp = new Node(); 
    temp.key = key; 
    temp.left = temp.right = null
    return (temp); 
  
static bool isSkewedBT(Node root) 
    // check if node is null or is a leaf node 
    if (root == null || (root.left == null && 
                        root.right == null)) 
        return true
  
    // check if node has two children if 
    // yes, return false 
    if (root.left!=null && root.right!=null
        return false
    if (root.left!=null
        return isSkewedBT(root.left); 
    return isSkewedBT(root.right); 
  
// Driver code 
public static void Main() 
    /* 10 
    / \ 
    12 13 
        / \ 
        14 15 
        / \ / \ 
    21 22 23 24 
    Let us create Binary Tree shown in above example */
    Node root = newNode(10); 
    root.left = newNode(12); 
    root.left.right = newNode(15); 
    Console.WriteLine( isSkewedBT(root)?1:0 ); 
  
    root = newNode(5); 
    root.right = newNode(4); 
    root.right.left = newNode(3); 
    root.right.left.right = newNode(2); 
    Console.WriteLine( isSkewedBT(root)?1:0 ); 
  
    root = newNode(5); 
    root.left = newNode(4); 
    root.left.right = newNode(3); 
    root.left.right.left = newNode(2); 
    root.left.right.right = newNode(4); 
    Console.WriteLine( isSkewedBT(root)?1:0 ); 
  
/* This code is contributed by Rajput-Ji*/

chevron_right


Output:

1
1
0

Time complexity of this solution is
Best case : O(1) when root has two children.
Worst case : O(h) when tree is skewed tree.



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.