1.概念解释:
表达式树其实就是叶节点装树,其他节点装符号的二叉树。
2.题目部分
这道题一开始没理解它的意思,以后写题一定要理解题意之后再动手。尤其是看清楚注意事项。
我一开始拿到题目,以为会有这种情况就是说一个节点之下会有一遍没有数字,那么这个树不就不能加括号了,所以以为这道题需要考虑很多情况,于是就去看了一下y总的思路,但是发现根本不是那样的,因为这道题保证表达式是可以计算的,所以只存在一种情况也就是题目给出的那种情况:
看左边,-号节点只有右边有个字母d,这种情况也是加括号。那题目其实很简单了。
节点除了根节点之外其实就三种情况。
1. 叶节点,我们直接接到字符串就可以了。
2. 如果不是叶节点,然后有两个节点,那么就将它作为一个表达式,然后用括号括好就行。
3.如果只有一个节点,前面我们已经讨论过了,其实处理方式和第2中情况没区别,当成第二种情况即可
然后我们就可以将代码顺利写出。
/**
* Definition for a binary tree node.
* struct TreeNode {
* string val;
* TreeNode *left;
* TreeNode *right;
* };
*/
class Solution {
public:
string str = "";
void dfs(TreeNode* root){
if(!root) return;
if(root->left==NULL && root->right==NULL){
str += root->val;
}else{
str += "(";
dfs(root->left);
str += root->val;
dfs(root->right);
str += ")";
}
}
string expressionTree(TreeNode* root) {
dfs(root->left);
str += root->val;
dfs(root->right);
return str;
}
};
至于为啥用一个全局变量,我当时是没多想,觉得这样好些一些,看了y总的录播,没想到歪打正着。
/**
* 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);
}
};
看上面这段代码,乍一看没有区别,但其实区别大了,我的写法只用O(n)的算法复杂度,但是他这个却需要O(N的平方),至于为什么,那是因为c++里函数返回字符串的时候是将字符串复制一份给我们,那如果是这样的话,我们拿笔分析一下。