使用" Node"动态构建二叉树。 python

时间:2018-03-02 15:35:45

标签: python binary-tree

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

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

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

Node”树结构总是节点(root_node,[leftChild,rightChild])。以下是表达式如何在树中表示的几个示例。

enter image description here

以下是我的代码目前所做的事情(complete code):

  1. 读入字符串表达式并将其拆分为标记
  2. 将运营商的索引存储在op_index

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

  4. 案例2:当表达式如((2 + 3)* 5) - 有两个运算符(将运算符设置为top_operator并对叶节点进行排序)

  5. 返回树

  6. 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
    

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

0 个答案:

没有答案