表达式转换为二叉树
Problem statement:
问题陈述:
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:
解:
Ternary expression: In C, we are acquainted with the ternary expression. Ternary expressions are equivalent to the if-else statement in C.
三元表达式:在C语言中,我们熟悉三元表达式。 三元表达式等效于C语言中的if-else语句。
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.
类似地,三元表达式可以转换为二叉树,其中a将是根,b将是左子,而c将是右。 这个小的缩图可以扩展(跟随)以嵌套三元表达式。
The algorithm for constructing the binary tree from the ternary expression is:
从三元表达式构造二叉树的算法是:
Pre-requisite:
先决条件:
Ternary expression str
三元表达海峡
Node* newNode(string str, index i) : Creates a new node with data value str[i]
Node * newNode(string str,index i) :创建一个新节点,其数据值为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
C ++实现
#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
翻译自: https://www.includehelp.com/icp/convert-ternary-expression-to-binary-tree.aspx
表达式转换为二叉树