表达树构造

表达树构造

问题

表达树是一个二叉树的结构,用于衡量特定的表达。所有表达树的叶子都有一个数字字符串值。而所有表达树的非叶子都有另一个操作字符串值。

给定一个表达数组,请构造该表达的表达树,并返回该表达树的根。
例子
对于 (2*6-(23+7)/(1+2)) 的表达(可表示为 [“2” “*” “6” “-” “(” “23” “+” “7” “)” “/” “(” “1” “+” “2” “)”]).
其表达树如下:

             [ - ]
         /          \
    [ * ]              [ / ]
  /     \           /         \
[ 2 ]  [ 6 ]      [ + ]        [ + ]
                 /    \       /      \
               [ 23 ][ 7 ] [ 1 ]   [ 2 ] .

在构造该表达树后,你只需返回根节点[-]。

思路

对所有操作符号 设置等级 + or - 1级 * or / 2级 对于括号包裹内容 提升2级。然后递归构建表达树

实现

#!/usr/bin/env python
# coding=utf-8
class ExpressionTreeNode:
    def __init__(self, symbol):
        self.symbol = symbol
        self.left, self.right = None, None
class Solution:
    # @param expression: A string list
    # @return: The root of expression tree
    def build(self, expression):
        # write your code here
        exp = self.filterBracket(expression)
        return self.buildChild(exp,self.initOperatorLevel(expression),0,len(exp))
    def initOperatorLevel(self,expression):
        level = []
        kuohao = 0
        for i,symbol in enumerate(expression):
            if(symbol == '+' or symbol == '-'):
                level.append(1+kuohao)
                continue
            if symbol == '*' or symbol == '/':
                level.append(2+kuohao)
                continue
            if symbol == '(':
                kuohao += 2
                continue
            if symbol == ')':
                kuohao -= 2
                continue
            level.append(10000)
        return level

    def filterBracket(self,expression):
        return list(filter(lambda a:a != '(' and a != ')',expression))

    def buildChild(self,expression,level,start,end):
        m = 10000
        index = start
        if end - start <= 1:
            return ExpressionTreeNode(expression[start])
        #找到根节点
        for i in range(start,end):
            if(level[i]<=m):
                m = level[i]
                index = i
        root = ExpressionTreeNode(expression[index])
        root.left = self.buildChild(expression,level,start,index)
        root.right = self.buildChild(expression,level,index+1,end)
        return root

def order(root,result):
    if root:
        result.append(root.symbol)
        if root.left:

        else:
            result.append('#')
        if root.right:
            order(root.right,result)
        else:
            result.append('#')

        order(root.left,result)




if __name__ == '__main__':
    root = Solution().build(["2","*","6","-","(","23","+","7",")","/","(","1","+","2",")"])
    result = []
    order(root,result)
    print(result)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值