Exemple #1
0
def product_rule(currentNode, currentValue, dStack):
    currentNode.Key = '/'

    gTree = currentNode.getLeftChild()
    dgTree = BinaryTree(currentNode.getLeftChild().key)
    dgNode = dgTree
    iStack = Stack()
    build_tree(currentNode.getLeftChild(), dStack, dgNode, iStack)
    dgTree = derivative(dgTree)

    fTree = currentNode.getRIghtChild()
    dfTree = BinaryTree(currentNode.getRightChild().key)
    dfNode = dfTree
    iStack = Stack()
    build_tree(currentNode.getRightChild(), dStack, dgNode, iStack)
    dfTree = derivative(dfTree)
    prodTree = BinaryTree('+')
    prodNode = quoTree
    prodNode = prodNode.getLeftChild
    prodNode.insertLeft('*')
    prodNode.insertRight('*')
    prodNode = quoNode.getRightChild
    prodNode.insertRight(dgTree)
    prodNode.insertLeft(fTree)
    prodNode = dStack.pop()
    prodNode.getLeftChild()
    prodNode.insertRight(dfTree)
    prodNode.insertLeft(gTree)
    der_output(prodNode)
Exemple #2
0
def chain_rule(currentNode, currentValue, dStack):
    currentNode.key = "*"
    power = currentNode.getRightChild().key

    innerTree = currentNode.getLeftChild()
    derInnerTree = BinaryTree(innerTree.key)
    derInnerNode = derInnerTree
    iStack = Stack()
    Misc.build_tree(currentNode.getLeftChild(), dStack, derInnerNode, iStack)
    derivative(derInnerTree)

    # building tree based on chain rule that will be inserted into original tree
    chainTree = BinaryTree('*')
    chainNode = chainTree
    chainNode.insertRight(derInnerTree)
    chainNode.insertLeft('*')
    chainNode = chainNode.getLeftChild()
    chainNode.insertLeft(power)
    chainNode.insertRight('^')
    chainNode = chainNode.getRightChild()
    chainNode.insertRight(power - 1)
    chainNode.insertLeft(innerTree)

    # inserting chain tree's first kids into original tree
    currentNode.insertLeft(chainTree.getLeftChild())
    currentNode.insertRight(chainTree.getRightChild())
Exemple #3
0
def buildParseTree(fpexp):
    fplist = mystr = re.findall(r'\s*([()+*/-]|\d+)', fpexp)
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree

    for i in fplist:
        if i == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()

        elif i in ['+', '-', '*', '/']:
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()

        elif i == ')':
            currentTree = pStack.pop()

        elif i not in ['+', '-', '*', '/', ')']:
            try:
                currentTree.setRootVal(int(i))
                parent = pStack.pop()
                currentTree = parent

            except ValueError:
                raise ValueError("token '{}' is not a valid integer".format(i))

    return eTree
def buildParseTree(fpexp):
    fplist = split_expression(fpexp)  # Exercise question
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree

    for i in fplist:
        if i == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()

        elif i in ['+', '-', '*', '/']:
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()

        elif i == ')':
            currentTree = pStack.pop()

        elif i not in ['+', '-', '*', '/', ')']:
            try:
                currentTree.setRootVal(int(i))
                parent = pStack.pop()
                currentTree = parent

            except ValueError:
                raise ValueError("token '{}' is not a valid integer".format(i))

    return eTree
def buildParseTree(math_exp):
    lst = math_exp.split()
    pstack = Stack()
    etree = BinaryTree("")
    pstack.push(etree)
    currentTree = etree

    for i in lst:
        if i == "(":
            currentTree = currentTree.insertLeft("")  # 此时尚在根结点(父节点)
            pstack.push(currentTree)
            currentTree = currentTree.getLeftChild()
        elif i not in "+-*/)":
            currentTree.setRootVal(eval(i))
            parent = pstack.pop()
            currentTree = parent
        elif i in "+-*/":
            currentTree.setRootVal(i)
            currentTree.insertRight("")
            pstack.push(currentTree)
        elif i == ")":
            currentTree = pstack.pop()
        else:
            raise ValueError("Unknow Operator:{}".format(i))

    return currentTree
def build_parse_tree(exp_string):
    exp_list = exp_string.split()  # 表达式符号列表
    parent_stack = Stack()  # 存储父节点的栈
    parse_tree = BinaryTree()  # 解析树
    node = parse_tree  # 当前节点

    for char in exp_list:
        if char == '(':
            # 创建并切换到左子节点
            parent_stack.push(node)
            node.insert_left()
            node = node.left_child
        elif char in '+-*/':
            # 切换回父节点,设置父节点的值
            node = parent_stack.pop()
            node.data = char
            # 创建并切换到右子节点
            parent_stack.push(node)
            node.insert_right()
            node = node.right_child
        elif char in ')':
            # 切换回父节点
            node = parent_stack.pop()
        elif char.isdigit():
            # 设置当前节点的值
            node.data = eval(char)
        else:
            raise ValueError(f'Unknown character: {char}')

    return parse_tree
def buildParseTree(fpexp):
    fplist = fpexp.split()
    pStack = Stack()  # following parent node
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree

    for i in fplist:
        if i == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()

        elif i in ['+', '-', '*', '/']:
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()

        elif i == ')':
            currentTree = pStack.pop()

        elif i not in ['+', '-', '*', '/', ')']:  # operands
            try:
                currentTree.setRootVal(int(i))
                parent = pStack.pop()
                currentTree = parent

            except ValueError:
                raise ValueError(
                    "Token '{}' is not a valid integer.".format(i))

    return eTree
Exemple #8
0
def buildParseTree(expr):
    lot = expr.split()
    tree = BinaryTree("")
    posStack = Stack()
    posStack.push(tree)
    currentTree = tree

    for token in lot:
        if token == "(":
            currentTree.insertLeft("")
            posStack.push(currentTree)
            currentTree = currentTree.getLeftChild()
        elif token == ")":
            currentTree = posStack.pop()
        elif token in ["and", "or"]:
            currentTree.setRootVal(token)
            currentTree.insertRight("")
            posStack.push(currentTree)
            currentTree = currentTree.getRightChild()
        elif token == "not":
            parent = posStack.pop()
            currentTree = parent
            currentTree.setRootVal(token)
            posStack.push(currentTree)
            currentTree = currentTree.getLeftChild()
        elif token in ["1", "0"]:
            currentTree.setRootVal(int(token))
            parent = posStack.pop()
            currentTree = parent
    return tree
def buildParseTree(fpexp):
    fplist = fpexp.split()
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree

    for word in fplist:
        if word == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()
        elif word not in '+-*/)':
            currentTree.setRootVal(eval(word))
            currentTree = pStack.pop()
        elif word in '+-*/':
            currentTree.setRootVal(word)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()
        elif word == ')':
            currentTree = pStack.pop()
        else:
            raise ValueError('运算表达式出现问题:' + word)

    return eTree
Exemple #10
0
def buildParseTree(fpexp):
    fplist = fpexp.split()
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree
    for i in fplist:
        if i == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()
        elif i not in '+-*/)':
            currentTree.setRootVal(eval(i))
            parent = pStack.pop()
            currentTree = parent
        elif i in '+-*/':
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()
        elif i == ')':
            currentTree = pStack.pop()
        else:
            raise ValueError("Unknown operator: " + i)
    return eTree
Exemple #11
0
def buildParseTree(fpexp):
####tokenize the expression to follow the rules:
    fplist=fpexp.split()
    pStack=Stack()
    eTree=BinaryTree('')
    pStack.push(eTree)
    currentTree=eTree
    
    for i in fplist:
        if i == '(':
           currentTree.insertLeft('')
           pStack.push(currentTree)
           currentTree=currentTree.getLeftChild()
           
        elif i in ['+', '-', '*', '/']:
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree=currentTree.getRightChild()
            
         elif i == ')':
             currentTree=pStack.pop()
             
         elif i not in ['+', '-', '*', '/',')']:
            try:
                 currentTree.setRootVal(int(i))
                 parent=pStack.pop()
                 currentTree=parent
            except ValueError:
                 raise ValueError("token '{}' is not a valid interger'.format(i))
                 
       return eTree  
def buildParseTree(fpexp):
    fplist = format_fpelist(fpexp)
    # fplist = fpexp.split()
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree

    for i in fplist:
        if i == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()
        elif i not in ['+', '-', '*', '/', ')']:
            currentTree.setRootVal(int(i))
            parrent = pStack.pop()
            currentTree = parrent
        elif i in ['+', '-', '*', '/']:
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()
        elif i == ')':
            currentTree = pStack.pop()
        else:
            raise ValueError
    return eTree
Exemple #13
0
def bulidParseTree(fpexp):
    '''
    思路————
    1. 首先,把全括号表达式 fpexp(有空格相间)拆分为单词 fplist 列表
    其中单词分为括号 "()"、操作符 "+-*/" 和操作数 "0~9" 
    左括号就代表表达式开始,右括号是表达式的结束(即表达式最外层有一括号)

    2. 从左到右扫描全括号表达式的每一个单词,依据规则建立解析树
    1) 如果当前单词是 "(": 为当前节点添加一个新节点作为其左子节点,
    当前节点下降,设这个节点为新节点
    2) 如果当前单词是操作符 ['+','-','*','/']: 将当前节点的值设为此符号,
    为当前节点添加一个新节点作为其右子节点,当前节点下降,设这个为新节点 
    3) 如果当前单词是操作数:将当前节点的值设为此数,当前节点上升返回到父节点
    4) 如果当前单词是 ")": 则当前节点上升返回到父节点

    其中,
    当前节点创建左右子树,可以调用 BinaryTree.insertLeft/Right
    当前节点设置值,可以调用 BinaryTree.setRootVal
    当前节点下降到左右子树,可以调用 BinaryTree.getLeft/RightChild
    但是,当前节点上升到父节点,这个没办法支持!

    不妨使用一个栈来记录跟踪父节点
    当前节点下降时,将下降前的节点 push 入栈
    当前节点需要上升到父节点时,上升到 pop 出栈的节点即可
    '''
    fplist = fpexp.split()
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree

    for i in fplist:
        if i == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()

        elif i in ['+', '-', '*', '/']:
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()

        elif i == ')':
            currentTree = pStack.pop()

        elif i not in ['+', '-', '*', '/', ')']:
            try:
                currentTree.setRootVal(int(i))
                parent = pStack.pop()
                currentTree = parent
            except ValueError:
                raise ValueError("token '{}' is not a valid integer".format(i))

    return eTree
def buildParseTree(fpexp):
    fplist = fpexp.split()
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree
    for i in fplist:
        if i == '(':                        currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()
        elif i not in '+-*/)':              currentTree.setRootVal(eval(i))
            parent = pStack.pop()
            currentTree = parent
Exemple #15
0
    def buildMathTree(self, expr):
        tokens = self.parseExpr(expr)
        pRoots = []  # list of parent roots
        cRoot = self.mTree  # current root

        for c in tokens:
            if c == '(':
                cRoot.insertRight({
                    'val': '(',
                })
                pRoots.append(cRoot)
                cRoot = cRoot.getRightChild()
            elif c == ')':
                while (pRoots[-1].getRootVal()['val'] != '('):
                    pRoots.pop()
                openParen = pRoots.pop()
                cRoot = pRoots.pop()
                cRoot.rightChild = openParen.rightChild
            else:
                curr_pred = self.pred[cRoot.getRootVal()['val']]
                new_pred = self.pred[c]

                while (curr_pred >= new_pred):
                    cRoot = pRoots.pop()
                    curr_pred = self.pred[cRoot.getRootVal()['val']]

                newNode = BinaryTree({
                    'val': c,
                })
                newNode.leftChild = cRoot.rightChild
                cRoot.rightChild = newNode
                pRoots.append(cRoot)
                cRoot = newNode

        self.mTree = pRoots[0].rightChild if len(
            pRoots) > 0 else cRoot.rightChild
        return self.mTree
Exemple #16
0
def quotient_rule(currentNode, currentValue, dStack):
    currentNode.Key = '/'

    gTree = currentNode.getLeftChild()
    dgTree = BinaryTree(currentNode.getLeftChild().key)
    dgNode = dgTree
    iStack = Stack()
    build_tree(currentNode.getLeftChild(), dStack, dgNode, iStack)
    dgTree = derivative(dgTree)

    fTree = currentNode.getRIghtChild()
    dfTree = BinaryTree(currentNode.getRightChild().key)
    dfNode = dfTree
    iStack = Stack()
    build_tree(currentNode.getRightChild(), dStack, dgNode, iStack)
    dfTree = derivative(dfTree)

    quoTree = BinaryTree('/')
    quoNode = quoTree
    quoNode.insertleft('-')
    quoNode.insertRight('^')
    quoNode = quoNode.getRightChild
    quoNode.insertRight('2')
    quoNode.insertLeft(gTree)
    quoNode.getLeftChild()
    quoNode = quoNode.getLeftChild
    quoNode.insertLeft('*')
    quoNode.insertRight('*')
    quoNode = quoNode.getRightChild
    quoNode.insertRight(dgTree)
    quoNode.insertLeft(fTree)
    quoNode = dStack.pop()
    quoNode.getLeftChild()
    quoNode.insertRight(dfTree)
    quoNode.insertLeft(gTree)
    der_output(quoTree)
def build_test_tree():
    root = BinaryTree('a')
    root.insert_left('b')
    root.insert_right('f')
    lnode = root.left_child
    lnode.insert_left('c')
    lnode.insert_right('d')
    lrnode = lnode.right_child
    lrnode.insert_right('e')
    rnode = root.right_child
    rnode.insert_left('g')

    return root
Exemple #18
0
    def __init__(self):
        # Precedence of operators
        self.pred = defaultdict(lambda: 10)
        self.pred['('] = 1
        self.pred[')'] = 1
        self.pred['+'] = 2
        self.pred['-'] = 2
        self.pred['*'] = 3
        self.pred['/'] = 3

        # A node contains a string value that represents
        # either an operator or a number.
        # A node also can contain other information, if necessary.
        # For example, if we run add_nterms(), then
        # each node contains the number of terms at the subtree rooted at the node.
        # The default root contains '(' as its value.
        self.mTree = BinaryTree({
            'val': '(',
        })
        else:
            return tree.getRootVal()


# 还原完全括号表达式
def printExp(tree):
    sumVal = ''

    if tree:
        currentVal = tree.getRootVal()
        if isinstance(currentVal, int):
            sumVal = printExp(tree.getLeftChild())
        else:
            sumVal = '(' + printExp(tree.getLeftChild())

        sumVal = sumVal + str(tree.getRootVal())

        if isinstance(currentVal, int):
            sumVal = sumVal + printExp(tree.getRightChild())
        else:
            sumVal = sumVal + printExp(tree.getRightChild()) + ')'
    return sumVal


etree = BinaryTree('*')
etree.insertRight(2)
etree.insertLeft(3)
preorder(etree)
print(printExp(etree))
print(postorderEval(etree))
Exemple #20
0
from pythonds.trees import BinaryTree

r = BinaryTree('a')
a = r.getRootVal()
print(a)
print(r.getLeftChild())
r.insertLeft('b')
print(r.getLeftChild())
print(r.getLeftChild().getRootVal())
# 3. Using the findSuccesor method, write a non-recursive inorder traversal for a binary search tree.
from pythonds.basic import Stack
from pythonds.trees import BinaryTree

# Inorder traversal using a Stack


def inorderTrav(tree):
    posStack = Stack()
    current = tree

    while current != None or posStack.size() > 0:
        # Left-most node
        while (current != None):
            posStack.push(current)
            current = current.getLeftChild()
        current = posStack.pop()
        print(current.getRootVal())

        current = current.getRightChild()


tree = BinaryTree("A")
tree.insertLeft("B")
tree.getLeftChild().insertLeft("C")
tree.getLeftChild().insertRight("D")
tree.insertRight("E")
inorderTrav(tree)
def ParseTree(exp):
    exp = exp.split()
    expTree = BinaryTree('')  # create an empty tree
    parents = Stack()  # create stack to hold the parents
    parents.push(expTree)  # root is kept on bttm of stack

    for item in exp:

        if item == '(':  # next item will be var or int, followed by an operator - we need to move down
            expTree.insertLeft(
                ''
            )  # insert empty node on left which will be a num or int later
            parents.push(expTree)
            expTree = expTree.getLeftChild(
            )  # move down so num or var can be placed

        elif item == ')':
            expTree = parents.pop()

        elif item in OPERATORS:
            expTree.key = item  # operator is placed at current node
            expTree.insertRight('')
            parents.push(expTree)
            expTree = expTree.getRightChild(
            )  # we move right because a symbol or an num must be placed next

        elif item not in SYMBOLS and item not in OPERATORS and item != "(" and item != ")":
            expTree.key = float(
                item
            )  # entering them as float in case anyone inputs float values
            expTree = parents.pop()

        elif item in SYMBOLS:
            expTree.key = item
            expTree = parents.pop()

    return expTree
# _*_ coding: utf-8 -*-
# @Time      : 8/27/20 3:19 PM
# @Author    : title_z
# @Filename  : Binarytree.py

from pythonds.trees import BinaryTree

# r = BinaryTree(3)
# BinaryTree.insertLeft(r, 4)
# BinaryTree.insertLeft(r, 5)
# BinaryTree.insertRight(r, 6)
# BinaryTree.insertRight(r, 7)
# l = BinaryTree.getLeftChild(r)
# print(l)

r = BinaryTree('a')
r.insertLeft('b')
r.insertRight('c')
r.getRightChild().setRootVal('hello')
r.getLeftChild().insertRight('d')
print(r)
 def __init__(self, rootObj):
     BinaryTree.__init__(self, rootObj)
     self.leftChildDer = None
     self.rightChildDer = None
     self.val = None