首页 > 其他分享 >考研数据结构——每日一题[二叉搜索树与表达式树]

考研数据结构——每日一题[二叉搜索树与表达式树]

时间:2023-08-04 11:05:38浏览次数:35  
标签:right TreeNode val dfs 二叉 return 数据结构 root 考研

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

相关文章

  • 数据结构杂烩
    线段树P4681[THUSC2015]平方运算简要题意给定一个序列,区间.map([](intx){x=x*x%p;});,区间求和。p给定,为小质数。\(N,M\le105\)。题解而把一个数看作一个点,向其平方取模连一条边,则最终必然构成一个基环森林,注意到\(P\)很小,每个数经过至多\(11\)次迭代之后......
  • DFS 算法模板——二叉树的遍历非递归写法要会,排列组合的一定要自己画一颗树,变量i和当
    dfs算法模板:1、下一层仅2个节点的dfs,也就是二叉树的dfs先序遍历,迭代和递归写法都要熟悉:defpreoder_traversal(root):ifnotroot:returnstack=[root]whilestack:node=stack.pop()dosomethingwithnodeifnode.ri......
  • 接口相似数据结构复用率高?Apipost这招搞定!
    在API设计和开发过程中,存在许多瓶颈,其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作:在每个API中都编写相同的数据,这不仅浪费时间和精力,还容易出错并降低API的可维护性。为了解决这个问题,Apipost推出了数据模型板块。用户可以预先创建多个数据模型,并在API设计过......
  • 接口相似数据结构复用率高?Apipost这招搞定!
    在API设计和开发过程中,存在许多瓶颈,其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作:在每个API中都编写相同的数据,这不仅浪费时间和精力,还容易出错并降低API的可维护性。为了解决这个问题,Apipost推出了数据模型板块。用户可以预先创建多个数据模型,并在API设计......
  • 计算二叉树的高度/深度
    计算二叉树的高度/深度默认根结点层次为1。如果为空树,高度为0;如果不是空树,树的高度就是左右子树中高度的较大者+1(+1是包含当前层次的高度)。//计算树的高度intTreeHeight(BTNode*root){ if(root==NULL) { return0; } //左右子树中的较大者+1返回 returnTreeHeight......
  • 二叉树的最小深度
    所以,如果左子树为空,右子树不为空,说明最小深度是1+右子树的深度。反之,右子树为空,左子树不为空,最小深度是1+左子树的深度。最后如果左右子树都不为空,返回左右子树深度最小值+1。1intminshendu(Node*node){2if(node==nullptr)return0;3if(node......
  • 求二叉树的最大深度
    此为有返回值的递归问题先确定终止条件(如果一个树为空树,它的高度就是0,我们直接返回0,根本不用递归)写出通式(1+max(左子树的最大深度,右子树的最大深度)规模更小的子问题),将通式写在return里面1intmaxshendu(Node*node){2if(node==nullptr)return0;3retur......
  • C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m
    动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表......
  • 考研数学欧几里得六点档整理
    时间内容类型7/4计算技巧7/5分部积分的一个绝妙用法计算技巧7/6对称区间定积分的计算二级结论7/7变限积分的积分的破题法题型归纳7/8变限积分的连续性与可导性二级结论7/9变限积分的奇偶性和周期性二级结论7/10求极限的第一要义——拆分......
  • 二叉树的顺序实现
    二叉树的顺序实现////main.c//SqBiTree////CreatedbyEasonon2020/8/7.//Copyright©2020Eason.Allrightsreserved.//#include<stdio.h>#defineOK1#defineERROR0#defineTRUE1#defineFALSE0#defineMAXSIZE100typedefintStatus;//作......