python构造二叉树_用python中的Node结构动态构造二叉树

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

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

树是二叉树。根节点总是一个运算符,叶总是数字。在

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

Gi6Uc.jpg

以下是我的代码当前的操作(complete code):读入字符串表达式并将其拆分为标记

将运算符的索引存储在op_index中

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

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

返回树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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的二叉树结构可以通过定义一个二叉树节点类来实现。每个节点包含一个数据项和两个指向左子树和右子树的指针。可以使用递归的方式来构建二叉树,并实现不同的遍历方法。下面是一个示例代码: ```python class BinaryTreeNode: def __init__(self, data): self.data = data self.left = None self.right = None class BinaryTree: def __init__(self, root): self.root = root def postorderTraversal(self, node): if node is None: return self.postorderTraversal(node.left) self.postorderTraversal(node.right) print(node.data, end=' ') def inorderTraversal(self, node): if node is None: return self.inorderTraversal(node.left) print(node.data, end=' ') self.inorderTraversal(node.right) def levelOrderTraversal(self, root): if root is None: return queue = [] queue.append(root) while queue: node = queue.pop(0) print(node.data, end=' ') if node.left: queue.append(node.left) if node.right: queue.append(node.right) # 创建二叉树 rootNode = BinaryTreeNode(1) rootNode.left = BinaryTreeNode(2) rootNode.right = BinaryTreeNode(3) rootNode.left.left = BinaryTreeNode(4) rootNode.left.right = BinaryTreeNode(5) rootNode.right.left = BinaryTreeNode(6) rootNode.right.right = BinaryTreeNode(7) # 创建二叉树对象 tree = BinaryTree(rootNode) # 遍历二叉树 print("后序遍历:", end='') tree.postorderTraversal(tree.root) print("\n序遍历:", end='') tree.inorderTraversal(tree.root) print("\n层次遍历:", end='') tree.levelOrderTraversal(tree.root) ``` 这段代码创建了一个二叉树,并通过后序遍历、序遍历和层次遍历方法进行了遍历。你可以根据自己的需要进行修改和扩展。注意,在代码,`BinaryTree`是二叉树的类,`BinaryTreeNode`是二叉树节点的类。`rootNode`是根节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值