python - 在python中按级别顺序遍历二叉树

标签 python binary-tree breadth-first-search tree-traversal

我有一个python script为给定的数学表达式生成二叉树。我正在尝试写一个 function to print the binary tree如果我按级别顺序遍历它。

例如如果函数是 ((2+3) - 4) 输出应该是

   -
  / \
 +   4
/ \
2  3

output: 
-
+ 4
2 3

将数学表达式转换为二叉树的代码

from pythonds.basic.stack import Stack
from pythonds.trees.binaryTree import BinaryTree

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(int(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
        return eTree

我正在使用标准伪代码进行广度优先搜索。

printTree(Node root)

   if(root == NULL) return

   else
      create a queue 'q'
      q.enqueue(root)

      while(q is not empty)
           root = q.dequeue
           print(root)

           if(leftChild != NULL)
              q.enqueue(leftChild)
           if(rightChild != NULL)
              q.enqueue(rightChild)

以下是我编写的用于按级别顺序打印树的 python 代码。

import sys

class Node:
    def __init__(self, data):
        self.data = data
        self.leftChild = None
        self.rightChid = None


class Queue:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def enqueue(self,item):
        self.items.insert(0, item)

    def dequeue(self):
        self.items.pop()

def printNodesInLevels(root):
    if root is None:
        return
    else:
        q = Queue()
        q.enqueue(root)

        while(q is not None):
            root = q.dequeue()
            print(root.getRootVal())

            if(root.leftChild is not None):
                q.enqueue(root.leftChild)

            if(root.rightChild is not None):
                q.enqueue(root.rightChild)

这就是我调用该函数的方式。

pt = buildParseTree("( ( 2 + 3 ) - 4 )")
printNodesInLevels(pt)

以下是我收到的错误消息。我认为我没有正确地将树的根传递给打印函数。

None

Traceback (most recent call last): File "C:/Users/YASODA/PycharmProjects/HelloWorld/BinaryTree.py", line 77, in printNodesInLevels(pt) File "C:/Users/YASODA/PycharmProjects/HelloWorld/BinaryTree.py", line 67, in printNodesInLevels if(root.leftChild is not None): AttributeError: 'NoneType' object has no attribute 'leftChild'

最佳答案

您的代码中有两个错误。第一个是,需要在出队中返回,

class Queue:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def enqueue(self,item):
        self.items.insert(0, item)

    def dequeue(self):
        return self.items.pop()

第二个是在 while 循环中检查队列是否为空,

while(not q.isEmpty()):

关于python - 在python中按级别顺序遍历二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48790542/

相关文章:

Python kdtree 查找 "n"最近邻组(坐标)

python - 让 HTML 在 django 管理显示中换行

c++ - 在 C++ 中分配给变量时出错

algorithm - 为什么我们要从队列中删除s?

python - 使用Python使用广度优先搜索算法的两个节点之间的距离

algorithm - 以给定顺序访问一组点的最小成本路径恰好一次?

python - 如何仅获取 pandas 数据帧的行索引

python - OpenCv Circle reshape() 和语法的基础是什么?

algorithm - 对二叉树中的元素进行排序

java - 将 Integer 对象转换为 int 类型时出现问题