3765. 表达式树
请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。
例如,当下列两棵表达式树作为算法的输入时:
输出的等价中缀表达式分别为 (a+b)(c(-d)) 和 (a*b)+(-(c-d))。
注意:
树中至少包含一个运算符。 当运算符是负号时,左儿子为空,右儿子为需要取反的表达式。 树中所有叶节点的值均为非负整数。
样例:
输入:二叉树[+, 12, *, null, null, 6, 4, null, null, null, null]如下图所示:
+
/ \
12 *
/ \
6 4
输出:12+(6*4)
数据范围 给定二叉树的非空结点数量保证不超过 1000。 给定二叉树保证能够转化为合法的中缀表达式。
再改看
O(n^2^)写法:
/**
* Definition for a binary tree node.
* struct TreeNode {
* string val;
* TreeNode *left;
* TreeNode *right;
* };
*/
class Solution {
public:
string dfs(TreeNode* root) {
if (!root) return "";
if (!root->left && !root->right) return root->val;
return '(' + dfs(root->left) + root->val + dfs(root->right) + ')';
}
string expressionTree(TreeNode* root) {
return dfs(root->left) + root->val + dfs(root->right);
}
};
因为return 会复制一遍,则 1 + 2+ 3 + ... + n ,达到O(n^2^) O(n)优化写法【取ans分别+=赋值,不用return】
/**
* Definition for a binary tree node.
* struct TreeNode {
* string val;
* TreeNode *left;
* TreeNode *right;
* };
*/
class Solution {
public:
string ans;
void dfs(TreeNode* root) {
if (!root) return;
if (!root->left && !root->right) ans += root->val;
else
{
ans += '(';
dfs(root->left);
ans += root->val;
dfs(root->right);
ans += ')';
}
}
string expressionTree(TreeNode* root) {
dfs(root->left), ans += root->val, dfs(root->right);
return ans;
}
};
标签:right,TreeNode,val,dfs,二叉,return,数据结构,root,考研
From: https://blog.51cto.com/u_15623277/6958282