使用“动态构造二叉树”;节点";python中的结构

使用“动态构造二叉树”;节点";python中的结构,python,binary-tree,Python,Binary Tree,我正在尝试使用zss库中的“Node”类型将数学表达式转换为二叉树结构。我之所以使用这种特殊的“节点”类型,是因为我想使用同一个库中的函数计算树编辑距离 数学表达式可以采用不同的格式,例如(28+32),((75+2)-21+(94-90)),((53+67)/2),((40*51)/(86-52))等 树是二叉树。根节点始终是运算符,叶子始终是数字 “”树结构总是节点(根节点,[leftChild,righchild])。下面是如何在树中表示表达式的几个示例 以下是我的代码当前的功能():

我正在尝试使用zss库中的“Node”类型将数学表达式转换为二叉树结构。我之所以使用这种特殊的“节点”类型,是因为我想使用同一个库中的函数计算树编辑距离

数学表达式可以采用不同的格式,例如(28+32),((75+2)-21+(94-90)),((53+67)/2),((40*51)/(86-52))等

树是二叉树。根节点始终是运算符,叶子始终是数字

“”树结构总是节点(根节点,[leftChild,righchild])。下面是如何在树中表示表达式的几个示例

以下是我的代码当前的功能():

  • 读入字符串表达式并将其拆分为标记
  • 将运算符的索引存储在op_索引中

  • 案例1:当表达式类似(2+3)时–有一个操作符(将操作符设置为top_操作符,对叶节点进行排序,并将最低的分配给左树(因此,(2+3)和(3+2)表达式将始终以相同的方式构建))

  • 案例2:当表达式为like((2+3)*5)时–有两个运算符(将运算符设置为top_运算符并对叶节点排序)

  • 还树



  • 我尝试为两种表达式类型编写代码。然而,我正试图找到一种更通用的方法来编写它,因为当表达式变得更复杂时,很难以静态方式构建树。

    我认为您希望递归地构建树。@meggar感谢您的建议。我来试试。你找到你的pb的解决方案了吗?@agenis我无法实现递归解决方案。所以我一直在用我的粗溶液。这是为了研究目的,所以我没有太多时间来实现一个漂亮的。
    def generateTree(bs):
        item = bs.split()
        op_index = []
        top_operator = []
        left_tree = []
        right_tree = []
    
        # stores the index of each operator in item list
        for i in range(0, len(item)):
    
            if item[i] in ['+', '-', '*', '/']:
                op_index.append(i)
    
    
        for n in op_index:
    
            #case 1
            if (len(op_index) == 1):
                top_operator.append(item[n])
                #a = Node(item[n - 1], [])
                #b = Node(item[n + 1], [])
    
                if(isLeftChildNodeSmaller(item[n-1], item[n+1]) == True):
                    left_tree.append(Node(item[n - 1], []))
                    right_tree.append(Node(item[n + 1], []))
    
                else:
                    left_tree.append(Node(item[n + 1], []))
                    right_tree.append(Node(item[n - 1], []))
    
            #case 2
            elif (len(op_index) == 2):
    
                if(isInt(item[n-1]) == True and isInt(item[n+1]) == True):
    
                    if (isLeftChildNodeSmaller(item[n - 1], item[n + 1]) == True):
                        c = Node(item[n],[Node(item[n - 1], []), Node(item[n + 1], [])])
    
                    else:
                        c = Node(item[n], [Node(item[n + 1], []), Node(item[n - 1], [])])
    
                    right_tree.append(c)
    
                else:
                    top_operator.append(item[n])
    
                    if(isInt(item[n-1]) == True):
                        left_tree.append(Node(item[n-1],[]))
                    else:
                        left_tree.append(Node(item[n+1], []))
    
    
                   right_tree.append(a)
    
    
    
        final_tree = Node(top_operator, [left_tree[0], right_tree[0]])
        return final_tree
    
    
        t1 = generateTree("( 2 + 1 )")
        t2 = generateTree("( 5 + ( 2 + 1 ) )")
    
        editDistance = simple_distance(t1,t2)
        print(editDistance) # returns 2