×

String Coding Problems

Arrays Coding Problems

Sorting Coding Problems

Searching Coding Problems

Coding Algorithms

Tree Coding Problems

Stack Coding Problems

Linked list Coding Problems

Graph Coding Problems

Greedy Algorithms Coding Problems

Dynamic Programming Coding Problems

Matrix Coding Problems

Recursion Coding Problems

Number Theory Coding Problems

Backtracking Coding Problems

Heap Coding Problems

Brute Force Coding Problems

Implementation Coding Problems

Google Contests

Competitive Programming Coding

Miscellaneous

Convert Ternary Expression to Binary Tree

In this article, we are going to see how to convert the ternary expression to a binary tree? This problem has been featured in Facebook interview.
Submitted by Radib Kar, on March 02, 2019 [Last updated : March 20, 2023]

Problem Description

Given a string that contains ternary expressions. The expressions may be nested. You need to convert the given ternary expression to a binary Tree and return the root.

Example

    Input:
    a?b:c

    Output:
      a
     / \
    b   c

    Input:
    a?b?c:d:e

    Output:
        a
       / \
      b   e
     / \
    c   d

Solution of Convert Ternary Expression to Binary Tree

Ternary expression: In C, we are acquainted with the ternary expression. Ternary expressions are equivalent to the if-else statement in C.

    if(a)
        b
    else
        c

    a,b,c=statements/expressions
    This if else statement is equivalent to a?b:c

Similarly, a ternary expression can be converted to a binary tree, where a will be the root, b will be the left child and c will be the right one. This small miniature can be expanded (followed) for nesting ternary expression.

The algorithm for constructing the binary tree from the ternary expression is:

Pre-requisite:

  1. Ternary expression str
  2. Node* newNode(string str, index i) : Creates a new node with data value str[i]

Algorithm

    //recursive function to build the tree
    FUNCTION convertExpression(string str, int& i) 
    1.  Create root referring to the current character(str[i]);
    root =newNode(str,i); //create a node with element str[i]
    2.  Increment i (index that point to current character);
        //if i<string length and current token is '?' increment i
    3.  IF(i<str.length() && str[i]=='?'){ 
	    //need to build left child recursively increment i
        root->left=convertExpression(str,i); 
	    //need to build right child recursively
        root->right=convertExpression(str,i); 
    4.  return root;

Algorithm with example

Tree nodes represented by their values only
Input string (ternary expression)
a?b:c
-------------------------------------------------
In main function we call convertExpression(str,0)
convertExpression(str,0):
root=newNode(str, 0); //root=a
i=1; //incremented
i<str.length() && str[i]=='?'
i=2;//incremented
root->left=convertExpression(str,2);
-------------------------------------------------

convertExpression(str,2):
root=newNode(str, 2); //root=b
i=3; //incremented
i<str.length()&& str[i]!='?'
return root //b
at convertExpression(str,0)
now root->left=b
i=4; //i++ step evaluated
root->right=convertExpression(str,4)
-------------------------------------------------

convertExpression(str,4):
root=newNode(str, 4); //root=c
i=5; //incremented
I is not <str.length()
return root //c
at convertExpression(str,0)
now root->right=c
return root;

returns to main
built tree:
  a
 / \
b   c

C++ implementation of Convert Ternary Expression to Binary Tree

#include <bits/stdc++.h>
using namespace std;

struct Node {
    char data;
    Node *left, *right;
};

//function to create node
Node* newNode(char Data)
{
    Node* new_node = new Node;
    new_node->data = Data;
    new_node->left = new_node->right = NULL;
    return new_node;
}

//function to traverse preorder
void preorder(Node* root)
{
    if (root == NULL)
        return;
    cout << root->data << " ";
    preorder(root->left);
    preorder(root->right);
}

//recursive function to build the tree
Node* convertExpression(string str, int& i)
{
    Node* root = newNode(str[i]);
    i++;
    if (i < str.length() && str[i] == '?') {
        i++;
        root->left = convertExpression(str, i);
        i++; //skipping ':' character
        root->right = convertExpression(str, i);
    }
    return root;
}

int main()
{
    string str;

    cout << "Enter your expression\n";
    cin >> str;

    int i = 0;
    Node* root = convertExpression(str, i);
    cout << "Printing pre-order traversal of the tree...\n";
    //pre-order traversal of the tree,
    //should be same with expressionthe
    preorder(root);
    cout << endl;

    return 0;
}

Output

First run:
Enter your expression
a?b:c
Printing pre-order traversal of the tree...
a b c

Second run:
Enter your expression
a?b?c:e:d
Printing pre-order traversal of the tree...
a b c e d




Comments and Discussions!

Load comments ↻





Copyright © 2024 www.includehelp.com. All rights reserved.