Python 后缀表示法逆波兰表示法的预排序
Python pre-order to postfix notation reverse polish notation
我正在尝试在 Python 中找到一个解决方案,尝试将预订符号例如“* + 7 3 - 2 9”或“+ 55 26”移动到 post 符号或逆波兰符号。预期的结果是例如分别为“7 3 + 2 9 - *”和“55 26 +”。我对二叉树做了一些研究,但是我正在努力使用数学函数。我目前拥有的是:
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
检查运算符的函数
def isOperator(self, c):
return c == '+' or c == '-' or c == '*' or c == '/'
插入节点
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
打印树
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
前序遍历
根 -> 左 -> 右
def PreorderTraversal(self, root):
res = []
if root:
res.append(root.data)
res = res + self.PreorderTraversal(root.left)
res = res + self.PreorderTraversal(root.right)
return res
后序遍历
左 -> 右 -> 根
def PostorderTraversal(self, root):
res = []
if root:
res = self.PostorderTraversal(root.left)
res = res + self.PostorderTraversal(root.right)
res.append(root.data)
return res
非常感谢任何帮助完成此代码的帮助,因为我无法解决这个问题。
提前致谢
首先是一些问题:
您的insert
方法应用二叉搜索树逻辑,这与您要构建的表达式树无关。相反,它应该跟踪任何下一个数据的插入点。
不清楚这些是否都是Node
class的方法,但至少isOperator
与任何实例值无关,所以应该不是方法(带有 self
参数),而是独立函数或静态方法。此外,如果输入有效,则运算符是任何非数字的东西。
方法不应打印(调试目的除外):留给主要驱动程序代码去做。方法可以通过返回迭代器或表示(实现 __repr__
)来帮助打印。
通常的做法是不对函数名称使用首字母大写,并将其保留给 class 个名称。
我建议为树单独 class。这将很方便地跟踪下一个节点应该插入的位置,使用路径(堆栈)。
以下是实现方法:
class Node:
def __init__(self, data, left=None, right=None):
self.left = left
self.right = right
self.data = data
def __iter__(self): # default iteration is inorder
if self.left:
yield from self.left
yield self.data
if self.right:
yield from self.right
def preorder(self):
yield self.data
if self.left:
yield from self.left.preorder()
if self.right:
yield from self.right.preorder()
def postorder(self):
if self.left:
yield from self.left.postorder()
if self.right:
yield from self.right.postorder()
yield self.data
class Tree:
def __init__(self):
self.root = None
self.path = []
def insert(self, data):
if not self.root:
node = self.root = Node(data)
elif not self.path:
raise ValueError("Cannot add more nodes")
elif self.path[-1].left:
node = self.path[-1].right = Node(data)
else:
node = self.path[-1].left = Node(data)
if not data.isnumeric(): # internal node
self.path.append(node)
else:
while self.path and self.path[-1].right:
self.path.pop()
@staticmethod
def fromstr(s):
tree = Tree()
for token in s.split():
tree.insert(token)
return tree
def __iter__(self):
if self.root:
yield from self.root
def preorder(self):
if self.root:
yield from self.root.preorder()
def postorder(self):
if self.root:
yield from self.root.postorder()
这里是 运行 的方法:
def postorder(s):
tree = Tree.fromstr(s)
# Just for debugging, print the tree in inorder:
print(*tree) # this calls `__iter__`
return " ".join(tree.postorder())
print(postorder("* + 7 3 - 2 9"))
输出(中序和后序):
7 + 3 * 2 - 9
7 3 + 2 9 - *
我正在尝试在 Python 中找到一个解决方案,尝试将预订符号例如“* + 7 3 - 2 9”或“+ 55 26”移动到 post 符号或逆波兰符号。预期的结果是例如分别为“7 3 + 2 9 - *”和“55 26 +”。我对二叉树做了一些研究,但是我正在努力使用数学函数。我目前拥有的是:
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
检查运算符的函数
def isOperator(self, c):
return c == '+' or c == '-' or c == '*' or c == '/'
插入节点
def insert(self, data):
if self.data:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
打印树
def PrintTree(self):
if self.left:
self.left.PrintTree()
print( self.data),
if self.right:
self.right.PrintTree()
前序遍历
根 -> 左 -> 右
def PreorderTraversal(self, root):
res = []
if root:
res.append(root.data)
res = res + self.PreorderTraversal(root.left)
res = res + self.PreorderTraversal(root.right)
return res
后序遍历
左 -> 右 -> 根
def PostorderTraversal(self, root):
res = []
if root:
res = self.PostorderTraversal(root.left)
res = res + self.PostorderTraversal(root.right)
res.append(root.data)
return res
非常感谢任何帮助完成此代码的帮助,因为我无法解决这个问题。
提前致谢
首先是一些问题:
您的
insert
方法应用二叉搜索树逻辑,这与您要构建的表达式树无关。相反,它应该跟踪任何下一个数据的插入点。不清楚这些是否都是
Node
class的方法,但至少isOperator
与任何实例值无关,所以应该不是方法(带有self
参数),而是独立函数或静态方法。此外,如果输入有效,则运算符是任何非数字的东西。方法不应打印(调试目的除外):留给主要驱动程序代码去做。方法可以通过返回迭代器或表示(实现
__repr__
)来帮助打印。通常的做法是不对函数名称使用首字母大写,并将其保留给 class 个名称。
我建议为树单独 class。这将很方便地跟踪下一个节点应该插入的位置,使用路径(堆栈)。
以下是实现方法:
class Node:
def __init__(self, data, left=None, right=None):
self.left = left
self.right = right
self.data = data
def __iter__(self): # default iteration is inorder
if self.left:
yield from self.left
yield self.data
if self.right:
yield from self.right
def preorder(self):
yield self.data
if self.left:
yield from self.left.preorder()
if self.right:
yield from self.right.preorder()
def postorder(self):
if self.left:
yield from self.left.postorder()
if self.right:
yield from self.right.postorder()
yield self.data
class Tree:
def __init__(self):
self.root = None
self.path = []
def insert(self, data):
if not self.root:
node = self.root = Node(data)
elif not self.path:
raise ValueError("Cannot add more nodes")
elif self.path[-1].left:
node = self.path[-1].right = Node(data)
else:
node = self.path[-1].left = Node(data)
if not data.isnumeric(): # internal node
self.path.append(node)
else:
while self.path and self.path[-1].right:
self.path.pop()
@staticmethod
def fromstr(s):
tree = Tree()
for token in s.split():
tree.insert(token)
return tree
def __iter__(self):
if self.root:
yield from self.root
def preorder(self):
if self.root:
yield from self.root.preorder()
def postorder(self):
if self.root:
yield from self.root.postorder()
这里是 运行 的方法:
def postorder(s):
tree = Tree.fromstr(s)
# Just for debugging, print the tree in inorder:
print(*tree) # this calls `__iter__`
return " ".join(tree.postorder())
print(postorder("* + 7 3 - 2 9"))
输出(中序和后序):
7 + 3 * 2 - 9
7 3 + 2 9 - *