📜  将三元表达式转换为二叉树

📅  最后修改于: 2022-05-13 01:57:06.990000             🧑  作者: Mango

将三元表达式转换为二叉树

给定一个包含三元表达式的字符串。表达式可以嵌套,任务是将给定的三元表达式转换为二叉树。

例子:

Input :  string expression =   a?b:c 
Output :        a
              /  \
             b    c

Input : expression =  a?b?c:d:e
Output :     a
           /  \
          b    e
        /  \
       c    d

被问到: Facebook 采访

想法是我们遍历一个字符串,将第一个字符作为根并递归执行以下步骤。
1. 如果我们看到符号“?”
…….. 然后我们添加下一个字符作为根的左孩子。
2. 如果我们看到符号 ':'
……..然后我们将它添加为当前根的右孩子。
执行此过程,直到我们遍历“String”的所有元素。

下面是上述想法的实现

C++
// C++ program to convert a ternary expression to
// a tree.
#include
using namespace std;
 
// tree structure
struct Node
{
    char data;
    Node *left, *right;
};
 
// function create a new 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 convert Ternary Expression to a Binary
// Tree. It return the root of tree
//Notice that we pass index i by reference because we want to skip the characters in the subtree
Node *convertExpression(string str, int & i)
{
    // store current character of expression_string
    // [ 'a' to 'z']
    Node * root =newNode(str[i]);
 
    //If it was last character return
    //Base Case
    if(i==str.length()-1) return root;
 
    // Move ahead in str
    i++;
    //If the next character is '?'.Then there will be subtree for the current node
    if(str[i]=='?')
    {
        //skip the '?'
        i++;
 
        //construct the left subtree
        //Notice after the below recursive call i will point to ':' just before the right child of current node since we pass i by reference
        root->left = convertExpression(str,i);
         
        //skip the ':' character
        i++;
 
        //construct the right subtree
        root->right = convertExpression(str,i);
        return root;
    }
    //If the next character is not '?' no subtree just return it
    else return root;
}
 
// function print tree
void printTree( Node *root)
{
    if (!root)
        return ;
    cout << root->data <<" ";
    printTree(root->left);
    printTree(root->right);
}
 
// Driver program to test above function
int main()
{
    string expression = "a?b?c:d:e";
    int i=0;
    Node *root = convertExpression(expression, i);
    printTree(root) ;
    return 0;
}


Java
// Java program to convert a ternary
// expression to a tree.
import java.util.Queue;
import java.util.LinkedList;
  
// Class to represent Tree node
class Node
{
    char data;
    Node left, right;
  
    public Node(char item)
    {
        data = item;
        left = null;
        right = null;
    }
}
  
// Class to convert a ternary expression to a Tree
class BinaryTree
{
    // Function to convert Ternary Expression to a Binary
    // Tree. It return the root of tree
    Node convertExpression(char[] expression, int i)
    {
        // Base case
        if (i >= expression.length)
            return null;
      
        // store current character of expression_string
        // [ 'a' to 'z']
        Node root = new Node(expression[i]);
      
        // Move ahead in str
        ++i;
      
        // if current character of ternary expression is '?'
        // then we add next character as a left child of
        // current node
        if (i < expression.length && expression[i]=='?')
            root.left = convertExpression(expression, i+1);
      
        // else we have to add it as a right child of
        // current node expression.at(0) == ':'
        else if (i < expression.length)
            root.right = convertExpression(expression, i+1);
      
        return root;
    }
     
    // function print tree
    public void printTree( Node root)
    {
        if (root == null)
            return;
                 
        System.out.print(root.data +" ");
        printTree(root.left);
        printTree(root.right);
    }
     
// Driver program to test above function
    public static void main(String args[])
    {
        String exp = "a?b?c:d:e";
        BinaryTree tree = new BinaryTree();
        char[] expression=exp.toCharArray();
        Node root = tree.convertExpression(expression, 0);
        tree.printTree(root) ;
    }
}
 
/* This code is contributed by Mr. Somesh Awasthi */


Python3
# Class to define a node
# structure of the tree
class Node:
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
 
# Function to convert ternary
# expression to a Binary tree
# It returns the root node
# of the tree
def convert_expression(expression, i):
    if i >= len(expression):
        return None
 
    # Create a new node object
    # for the expression at
    # ith index
    root = Node(expression[i])
 
    i += 1
 
    # if current character of
    # ternary expression is '?'
    # then we add next character
    # as a left child of
    # current node
    if (i < len(expression) and
                expression[i] is "?"):
        root.left = convert_expression(expression, i + 1)
         
    # else we have to add it
    # as a right child of
    # current node expression[0] == ':'
    elif i < len(expression):
        root.right = convert_expression(expression, i + 1)
    return root
 
# Function to print the tree
# in a pre-order traversal pattern
def print_tree(root):
    if not root:
        return
    print(root.data, end=' ')
    print_tree(root.left)
    print_tree(root.right)
 
# Driver Code
if __name__ == "__main__":
    string_expression = "a?b?c:d:e"
    root_node = convert_expression(string_expression, 0)
    print_tree(root_node)
 
# This code is contributed
# by Kanav Malhotra


C#
// C# program to convert a ternary
// expression to a tree.
using System;
 
// Class to represent Tree node
public class Node
{
    public char data;
    public Node left, right;
 
    public Node(char item)
    {
        data = item;
        left = null;
        right = null;
    }
}
 
// Class to convert a ternary
// expression to a Tree
public class BinaryTree
{
    // Function to convert Ternary Expression
    // to a Binary Tree. It return the root of tree
    public virtual Node convertExpression(char[] expression,
                                          int i)
    {
        // Base case
        if (i >= expression.Length)
        {
            return null;
        }
 
        // store current character of
        // expression_string [ 'a' to 'z']
        Node root = new Node(expression[i]);
 
        // Move ahead in str
        ++i;
 
        // if current character of ternary expression
        // is '?' then we add next character as a
        // left child of current node
        if (i < expression.Length && expression[i] == '?')
        {
            root.left = convertExpression(expression, i + 1);
        }
 
        // else we have to add it as a right child
        // of current node expression.at(0) == ':'
        else if (i < expression.Length)
        {
            root.right = convertExpression(expression, i + 1);
        }
 
        return root;
    }
 
    // function print tree
    public virtual void printTree(Node root)
    {
        if (root == null)
        {
            return;
        }
 
        Console.Write(root.data + " ");
        printTree(root.left);
        printTree(root.right);
    }
 
// Driver Code
public static void Main(string[] args)
{
    string exp = "a?b?c:d:e";
    BinaryTree tree = new BinaryTree();
    char[] expression = exp.ToCharArray();
    Node root = tree.convertExpression(expression, 0);
    tree.printTree(root);
}
}
 
// This code is contributed by Shrikant13


Javascript


输出 :

a b c d e