【问题标题】:Sorting and Alphabetizing String Inputs for Binary Tree对二叉树的字符串输入进行排序和字母排序
【发布时间】:2019-08-25 20:17:09
【问题描述】:

我必须根据二叉树结构创建一个包含 6 个名称的来宾列表。 该列表需要按字母顺序排列,然后按名称以字母 A-L 和 M-Z 开头的名称排序为 2 个列表。 但是,当我运行此代码时,它只会按照每个类别下的输入顺序仅打印列表中的 5 个元素。 任何帮助将不胜感激。我是编程、Python 和 stackoverflow 的新手,并且已经被分配了这门课程,并且花了一个多星期的时间查看不同的材料,但我只是卡住了。谢谢。

IDLE Python 3.6,我想我需要使用某种排序方法,或者我的 enterguest 循环可能有错误或缺少组件

class Node(object):                       
    def __ init __(self):   
        self.left = None
        self.right = None
        self.data = list()


def enterguest(root, guest):    
    if guest < root.data[0]:
        if root.left == None:
            root.left = Node()
            root.left.data.append(guest)
        else:
            enterguest(root.left, guest)
    else:
        if guest > root.data[0]:
            if root.right == None:
                root.right = Node()
                root.right.data.append(guest)
            else:
                enterguest(root.right, guest)
        else:
            root.data.append(guest)


def guestresults(root):
    if root == None:
        return
    print(root.data)
    guestresults(root.left)
    guestresults(root.right)

root = Node()       
root.data.append("M")
for i in range (0, 6):
    enterguest(root, input("Enter guest name:"))
print("Guests A-L")
guestresults(root.left)
print("Guests M-Z")
guestresults(root.right)

我希望输出是按字母顺序排列的 6 个名称,并根据每个名称的第一个字母分成两个列表,一个列表是名称 A-L,第二个列表是名称 M-Z。实际输出是按照我创建的每个类别下的输入顺序显示相同的 5 个名称。

【问题讨论】:

    标签: python list sorting binary alphabetical


    【解决方案1】:

    实际上,您的代码会按顺序打印子树(即父项在子项之前),而您应该按顺序打印(左子优先,然后是父项,然后是右子项)。

    所以改变:

    print(root.data)
    guestresults(root.left)
    guestresults(root.right)
    

    到:

    guestresults(root.left)
    print(root.data)
    guestresults(root.right)
    

    当您输入“M”作为名称时会出现另一个问题:在这种情况下,它会附加到您永远不会输出的根数据中。

    我会通过不在同一个节点中存储相等的字符串来避免此类问题。当你有一个平等的时候,也去找合适的孩子。所以改变:

    else:
        if guest > root.data[0]:
            if root.right == None:
                root.right = Node()
                root.right.data.append(guest)
            else:
                enterguest(root.right, guest)
        else:
            root.data.append(guest)
    

    到:

    else:
        if root.right == None:
            root.right = Node()
            root.right.data.append(guest)
        else:
            enterguest(root.right, guest)
    

    通过此更改,它将起作用。但也请考虑以下几点可以改进您的解决方案:

    • 既然您不再在一个节点中存储多个字符串,请不要将data 属性创建为list

    • Node 构造函数接受一个参数,这样您就可以在构造时立即设置data 属性。

    • 不要创建函数enterguestguestresults,而是尝试将它们创建为类的方法。这更符合面向对象的方法。

    • 不要在这些函数中使用print,而是考虑将结果返回作为一个列表(或yield一个一个的结果)。只保留主程序的实际打印。将(业务)逻辑与实际输出代码分开总是好的。

    【讨论】:

    • 非常感谢您提供更好的编程风格的信息和建议。这些修复完全解决了我的代码问题。
    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2017-10-04
    相关资源
    最近更新 更多