Write a code to get the depth of the deepest odd level leaf node in a binary tree. Consider that level starts with 1. Depth of a leaf node is number of nodes on the path from root to leaf (including both leaf and root).
For example, consider the following tree. The deepest odd level node is the node with value 9 and depth of this node is 5.
1
/ \
2 3
/ / \
4 5 6
\ \
7 8
/ \
9 10
/
11
The idea is to recursively traverse the given binary tree and while traversing, maintain a variable “level” which will store the current node’s level in the tree. If current node is leaf then check “level” is odd or not. If level is odd then return it. If current node is not leaf, then recursively find maximum depth in left and right subtrees, and return maximum of the two depths.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int max( int x, int y)
{
return (x > y)? x : y;
}
struct Node
{
int data;
struct Node *left, *right;
};
struct Node* newNode( int data)
{
struct Node* node = ( struct Node*) malloc ( sizeof ( struct Node));
node->data = data;
node->left = node->right = NULL;
return node;
}
int depthOfOddLeafUtil( struct Node *root,
int level)
{
if (root == NULL)
return 0;
if (root->left == NULL &&
root->right == NULL && level & 1)
return level;
return max(depthOfOddLeafUtil(root->left, level + 1),
depthOfOddLeafUtil(root->right, level + 1));
}
int depthOfOddLeaf( struct Node *root)
{
int level = 1, depth = 0;
return depthOfOddLeafUtil(root, level);
}
int main()
{
struct Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->right->left = newNode(5);
root->right->right = newNode(6);
root->right->left->right = newNode(7);
root->right->right->right = newNode(8);
root->right->left->right->left = newNode(9);
root->right->right->right->right = newNode(10);
root->right->right->right->right->left = newNode(11);
cout << depthOfOddLeaf(root)
<< " is the required depth" ;
getchar ();
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
int max( int x, int y) { return (x > y)? x : y; }
struct Node
{
int data;
struct Node *left, *right;
};
struct Node* newNode( int data)
{
struct Node* node = ( struct Node*) malloc ( sizeof ( struct Node));
node->data = data;
node->left = node->right = NULL;
return node;
}
int depthOfOddLeafUtil( struct Node *root, int level)
{
if (root == NULL)
return 0;
if (root->left==NULL && root->right==NULL && level&1)
return level;
return max(depthOfOddLeafUtil(root->left, level+1),
depthOfOddLeafUtil(root->right, level+1));
}
int depthOfOddLeaf( struct Node *root)
{
int level = 1, depth = 0;
return depthOfOddLeafUtil(root, level);
}
int main()
{
struct Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->right->left = newNode(5);
root->right->right = newNode(6);
root->right->left->right = newNode(7);
root->right->right->right = newNode(8);
root->right->left->right->left = newNode(9);
root->right->right->right->right = newNode(10);
root->right->right->right->right->left = newNode(11);
printf ( "%d is the required depth\n" , depthOfOddLeaf(root));
getchar ();
return 0;
}
|
Java
class Node
{
int data;
Node left, right;
Node( int item)
{
data = item;
left = right = null ;
}
}
class BinaryTree
{
Node root;
int depthOfOddLeafUtil(Node node, int level)
{
if (node == null )
return 0 ;
if (node.left == null && node.right == null && (level & 1 ) != 0 )
return level;
return Math.max(depthOfOddLeafUtil(node.left, level + 1 ),
depthOfOddLeafUtil(node.right, level + 1 ));
}
int depthOfOddLeaf(Node node)
{
int level = 1 , depth = 0 ;
return depthOfOddLeafUtil(node, level);
}
public static void main(String args[])
{
int k = 45 ;
BinaryTree tree = new BinaryTree();
tree.root = new Node( 1 );
tree.root.left = new Node( 2 );
tree.root.right = new Node( 3 );
tree.root.left.left = new Node( 4 );
tree.root.right.left = new Node( 5 );
tree.root.right.right = new Node( 6 );
tree.root.right.left.right = new Node( 7 );
tree.root.right.right.right = new Node( 8 );
tree.root.right.left.right.left = new Node( 9 );
tree.root.right.right.right.right = new Node( 10 );
tree.root.right.right.right.right.left = new Node( 11 );
System.out.println(tree.depthOfOddLeaf(tree.root) +
" is the required depth" );
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self .left = None
self .right = None
def depthOfOddLeafUtil(root, level):
if root is None :
return 0
if root.left is None and root.right is None and level& 1 :
return level
return ( max (depthOfOddLeafUtil(root.left, level + 1 ),
depthOfOddLeafUtil(root.right, level + 1 )))
def depthOfOddLeaf(root):
level = 1
depth = 0
return depthOfOddLeafUtil(root, level)
root = Node( 1 )
root.left = Node( 2 )
root.right = Node( 3 )
root.left.left = Node( 4 )
root.right.left = Node( 5 )
root.right.right = Node( 6 )
root.right.left.right = Node( 7 )
root.right.right.right = Node( 8 )
root.right.left.right.left = Node( 9 )
root.right.right.right.right = Node( 10 )
root.right.right.right.right.left = Node( 11 )
print ( "%d is the required depth" % (depthOfOddLeaf(root)))
|
C#
using System;
public class Node
{
public int data;
public Node left, right;
public Node( int item)
{
data = item;
left = right = null ;
}
}
public class BinaryTree
{
public Node root;
public virtual int depthOfOddLeafUtil(Node node, int level)
{
if (node == null )
{
return 0;
}
if (node.left == null && node.right == null && (level & 1) != 0)
{
return level;
}
return Math.Max(depthOfOddLeafUtil(node.left, level + 1),
depthOfOddLeafUtil(node.right, level + 1));
}
public virtual int depthOfOddLeaf(Node node)
{
int level = 1, depth = 0;
return depthOfOddLeafUtil(node, level);
}
public static void Main( string [] args)
{
int k = 45;
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.right.left = new Node(5);
tree.root.right.right = new Node(6);
tree.root.right.left.right = new Node(7);
tree.root.right.right.right = new Node(8);
tree.root.right.left.right.left = new Node(9);
tree.root.right.right.right.right = new Node(10);
tree.root.right.right.right.right.left = new Node(11);
Console.WriteLine(tree.depthOfOddLeaf(tree.root) + " is the required depth" );
}
}
|
Javascript
<script>
class Node {
constructor(val) {
this .data = val;
this .left = null ;
this .right = null ;
}
}
var root;
function depthOfOddLeafUtil(node , level) {
if (node == null )
return 0;
if (node.left == null && node.right ==
null && (level & 1) != 0)
return level;
return Math.max(depthOfOddLeafUtil(node.left, level + 1),
depthOfOddLeafUtil(node.right, level + 1));
}
function depthOfOddLeaf(node) {
var level = 1, depth = 0;
return depthOfOddLeafUtil(node, level);
}
var k = 45;
root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.right.left = new Node(5);
root.right.right = new Node(6);
root.right.left.right = new Node(7);
root.right.right.right = new Node(8);
root.right.left.right.left = new Node(9);
root.right.right.right.right = new Node(10);
root.right.right.right.right.left = new Node(11);
document.write(
depthOfOddLeaf(root) + " is the required depth"
);
</script>
|
Output
5 is the required depth
Time Complexity: The function does a simple traversal of the tree, so the complexity is O(n).
Auxiliary Space: O(h) where h is the height of the tree.
Iterative Approach: Traverse the tree in iterative fashion for each level, and whenever you encounter the leaf node, check if level is odd, if level is odd, then update the result.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int data;
Node *left, *right;
};
Node* newNode( int data)
{
Node* temp = new Node();
temp->data = data;
temp->left = temp->right = NULL;
return temp;
}
int maxOddLevelDepth(Node* root)
{
if (!root)
return 0;
queue<Node*> q;
q.push(root);
int result = INT_MAX;
int level = 0;
while (!q.empty())
{
int size = q.size();
level += 1;
while (size > 0)
{
Node* temp = q.front();
q.pop();
if (!temp->left && !temp->right
&& (level % 2 != 0))
{
result = level;
}
if (temp->left)
{
q.push(temp->left);
}
if (temp->right)
{
q.push(temp->right);
}
size -= 1;
}
}
return result;
}
int main()
{
Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->right->left = newNode(5);
root->right->right = newNode(6);
root->right->left->right = newNode(7);
root->right->right->right = newNode(8);
root->right->left->right->left = newNode(9);
root->right->right->right->right = newNode(10);
root->right->right->right->right->left = newNode(11);
int result = maxOddLevelDepth(root);
if (result == INT_MAX)
cout << "No leaf node at odd level\n" ;
else
cout << result;
cout << " is the required depth " << endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static class Node
{
int data;
Node left, right;
};
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.left = temp.right = null ;
return temp;
}
static int maxOddLevelDepth(Node root)
{
if (root == null )
return 0 ;
Queue<Node> q = new LinkedList<>();
q.add(root);
int result = Integer.MAX_VALUE;
int level = 0 ;
while (!q.isEmpty())
{
int size = q.size();
level += 1 ;
while (size > 0 )
{
Node temp = q.peek();
q.remove();
if (temp.left == null &&
temp.right == null && (level % 2 != 0 ))
{
result = level;
}
if (temp.left != null )
{
q.add(temp.left);
}
if (temp.right != null )
{
q.add(temp.right);
}
size -= 1 ;
}
}
return result;
}
public static void main(String[] args)
{
Node root = newNode( 1 );
root.left = newNode( 2 );
root.right = newNode( 3 );
root.left.left = newNode( 4 );
root.right.left = newNode( 5 );
root.right.right = newNode( 6 );
root.right.left.right = newNode( 7 );
root.right.right.right = newNode( 8 );
root.right.left.right.left = newNode( 9 );
root.right.right.right.right = newNode( 10 );
root.right.right.right.right.left = newNode( 11 );
int result = maxOddLevelDepth(root);
if (result == Integer.MAX_VALUE)
System.out.println( "No leaf node at odd level" );
else
{
System.out.print(result);
System.out.println( " is the required depth " );
}
}
}
|
Python3
INT_MAX = 2 * * 31
class newNode:
def __init__( self , data):
self .data = data
self .left = self .right = None
def maxOddLevelDepth(root) :
if ( not root):
return 0
q = []
q.append(root)
result = INT_MAX
level = 0
while ( len (q)) :
size = len (q)
level + = 1
while (size > 0 ) :
temp = q[ 0 ]
q.pop( 0 )
if ( not temp.left and not temp.right
and (level % 2 ! = 0 )) :
result = level
if (temp.left) :
q.append(temp.left)
if (temp.right) :
q.append(temp.right)
size - = 1
return result
if __name__ = = '__main__' :
root = newNode( 1 )
root.left = newNode( 2 )
root.right = newNode( 3 )
root.left.left = newNode( 4 )
root.right.left = newNode( 5 )
root.right.right = newNode( 6 )
root.right.left.right = newNode( 7 )
root.right.right.right = newNode( 8 )
root.right.left.right.left = newNode( 9 )
root.right.right.right.right = newNode( 10 )
root.right.right.right.right.left = newNode( 11 )
result = maxOddLevelDepth(root)
if (result = = INT_MAX) :
print ( "No leaf node at odd level" )
else :
print (result, end = "")
print ( " is the required depth " )
|
C#
using System;
using System.Collections.Generic;
class GFG
{
public class Node
{
public int data;
public Node left, right;
};
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.left = temp.right = null ;
return temp;
}
static int maxOddLevelDepth(Node root)
{
if (root == null )
return 0;
Queue<Node> q = new Queue<Node>();
q.Enqueue(root);
int result = int .MaxValue;
int level = 0;
while (q.Count != 0)
{
int size = q.Count;
level += 1;
while (size > 0)
{
Node temp = q.Peek();
q.Dequeue();
if (temp.left == null &&
temp.right == null &&
(level % 2 != 0))
{
result = level;
}
if (temp.left != null )
{
q.Enqueue(temp.left);
}
if (temp.right != null )
{
q.Enqueue(temp.right);
}
size -= 1;
}
}
return result;
}
public static void Main(String[] args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.right.left = newNode(5);
root.right.right = newNode(6);
root.right.left.right = newNode(7);
root.right.right.right = newNode(8);
root.right.left.right.left = newNode(9);
root.right.right.right.right = newNode(10);
root.right.right.right.right.left = newNode(11);
int result = maxOddLevelDepth(root);
if (result == int .MaxValue)
Console.WriteLine( "No leaf node at odd level" );
else
{
Console.Write(result);
Console.WriteLine( " is the required depth " );
}
}
}
|
Javascript
<script>
class Node {
constructor() {
this .data = 0;
this .left = null ;
this .right = null ;
}
}
function newNode(data) {
var temp = new Node();
temp.data = data;
temp.left = temp.right = null ;
return temp;
}
function maxOddLevelDepth(root) {
if (root == null ) return 0;
var q = [];
q.push(root);
var result = 2147483647;
var level = 0;
while (q.length != 0) {
var size = q.length;
level += 1;
while (size > 0) {
var temp = q[0];
q.shift();
if (temp.left == null && temp.right == null &&
level % 2 != 0) {
result = level;
}
if (temp.left != null ) {
q.push(temp.left);
}
if (temp.right != null ) {
q.push(temp.right);
}
size -= 1;
}
}
return result;
}
var root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.right.left = newNode(5);
root.right.right = newNode(6);
root.right.left.right = newNode(7);
root.right.right.right = newNode(8);
root.right.left.right.left = newNode(9);
root.right.right.right.right = newNode(10);
root.right.right.right.right.left = newNode(11);
var result = maxOddLevelDepth(root);
if (result == 2147483647)
document.write( "No leaf node at odd level" );
else {
document.write(result);
document.write( " is the required depth" );
}
</script>
|
Output
5 is the required depth
Time Complexity: Time Complexity is O(n).
Auxiliary Space: O(n)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
08 Mar, 2023
Like Article
Save Article