当前位置: 首页 > 面试题库 >

从代数表达式创建二叉树

周培
2023-03-14
问题内容

我必须在Java中创建一个算术评估器。为此,我必须在二叉树中解析一个代数表达式,然后计算并返回结果。因此,对于第一步,我如何解析二叉树中的表达式?我知道理论,但是我的问题是如何用Java做到这一点。

但是我缺少基本的技巧或方法。我知道如何创建节点(我有一个带有returnNodeValue,isLeaf,isDoubleNode,isSingleNode等方法的类),但我认为我需要一种在二叉树中插入节点以实现所需功能的方法。有任何想法吗?


问题答案:

前缀表达式的树结构

def insert

     Insert each token in the expression from left to right:

     (0) If the tree is empty, the first token in the expression (must
         be an operator) becomes the root

     (1) Else if the last inserted token is an
         operator, then insert the token as the left child of the last inserted
         node.

     (2) Else if the last inserted token is an operand, backtrack up the
         tree starting from the last inserted node and find the first node with a NULL
         right child, insert the token there. **Note**: don't insert into the last inserted 
         node. 
end def

让我们做一个例子: + 2 + 1 1

套用(0)。

  +

套用(1)。

  +
 /
2

套用(2)。

  +
 / \
2   +

套用(1)。

  +
 / \
2   +
   /
  1

最后,应用(2)。

  +
 / \
2   +
   / \
  1   1

该算法已针对 - * / 15 - 7 + 1 1 3 + 2 + 1 1

因此Tree.insert执行就是这三个规则。

insert(rootNode, token)
  //create new node with token
  if (isLastTokenOperator)//case 1
      //insert into last inserted's left child
  else {                  //case 2
      //backtrack: get node with NULL right child
      //insert
  }
  //maintain state
  lastInsertedNode = ?, isLastTokenOperator = ?

评估树有点有趣,因为您必须从树的右下角开始。执行反向后置遍历。首先拜访合适的孩子。

evalPostorder(node)
  if (node == null) then return 0
  int rightVal = evalPostorder(node.right)
  int leftVal = evalPostorder(node.left)
  if(isOperator(node.value)) 
       return rightVal <operator> leftVal    
  else
       return node.value

考虑到从前缀表达式构造树的简单性,我建议使用标准堆栈算法将中缀转换为前缀。在实践中,您将使用堆栈算法来计算中缀表达式。



 类似资料:
  • 我得到了一个包含运算符、、*、和括号的算术公式(这可能会改变运算符的自然优先级,也可能不会改变)。例如:a/b f–(c d)*e–a*c。我被要求使用堆栈(实现为链表)来跟踪操作数和运算符:我的程序应该如何工作的示例如下: 读取、推送操作数堆栈 读取/推送运算符堆栈 读取b,推送操作数堆栈 Read:的优先级低于/,因此: 从操作数堆栈中弹出2个操作数(a和b) 弹出/来自运算符堆栈 创建子树并

  • 问题内容: 我有采用SQL where子句的函数,我想知道是否有一种方法可以使它们全部成为强类型。有没有办法采用lambda表达式,例如=> a.AgencyID == id并将其转换为字符串where子句?就像“ AgencyID =’idValue’”一样? 谢谢! 问题答案: 您可以将lambda函数转换为表达式树,然后遍历该树以构建您的字符串。

  • 我正在研究一个小算法,它可以按照级别顺序构建二叉树。我得到了一个数组,我必须使用其中的值按级别顺序构建二叉树。示例:arr inarr[5]={1,2,3,4,5}; 给定这样的数组,我需要填写一个二叉树,看起来像这样: (*为NULL)节点是基本的二进制节点,具有左指针和右指针以及用于保存数组中值的int的空格。 我理解根据树的高度遍历树的概念,一次遍历一个层次,但我不确定以这种方式构建树的正确

  • 我想从前缀符号创建算术二叉树。 我的树定义为: 我想把它转换成算术二叉树,像这样:算术树 为了从字符串计算前缀表达式,我编写了以下函数: 这基本上是维基百科的算法 现在我想将前缀表达式转换为算术树,这样我就可以遍历树并以这种方式对其求值,或者将其转换为后缀或中缀。 我怎么能这么做? 我想在折叠时不要计算堆栈,而是创建节点,但我不知道如何用Haskell来表达它。 有人能给我一个提示吗?

  • 好的,所以我目前正在尝试创建一个二叉搜索树,每个节点都包含对某个对象的引用,以及对其左侧子项的引用和对右子项的引用(总共3个变量)。左子项必须始终小于其父项,而右子项必须始终大于其父项。我必须创建两个方法:1种方法( contains()) 来检查元素是否在树中,以及一个add()方法将元素添加到树中的适当位置。 以下是BinarySearchTree类: 下面是TreeNode类(包含在Bina

  • 我在一个多语言网站上工作,并已选择使用每种语言的自定义URL,例如: 两者都指向城市控制员的指数方法。 在每个页面上都有一个切换语言的选项,它会在我的路由中查找以匹配控制器、视图和语言。 因此,如果我在荷兰语页面上,它会找到英文版的正确网址,即“城市”而不是“steden”。 在我开始使用更复杂的正则表达式之前,一切都很好。 我有这些正则表达式,它们将匹配我所需的URL: 在我的代码中,我可以访问