为树中的每个级别分配一个数字

时间:2014-03-11 00:23:58

标签: python tree

我正在尝试创建一个方法* set_number *,它接受一个值并将树中第一个级别的self.number设置为该给定值,并将树中下一个级别的self.number设置为之前的值(self.number)+ 1,等等第四。

这就是我到目前为止所提出的:

class Node:

    def __init__(self, item, left=None, right=None):

        self.item = item
        self.left = left
        self.right = right
        self.number = 0

    def set_number(self, value):

        if self.left == None and self.right == None:
            self.number = value
        elif self.left:
            self.number = max(self.number, self.left.set_number(value + 1))
        elif self.right:
            self.number = max(self.number, self.right.set_number(value + 1))
        return self.number

我的意思的一个例子:

示例树:

                  5
                /  \
              2      6

tree = Node(5, Node(2), Node(6))
tree.set_number(2)

.set_number(2)对该树做了什么:

                  5   <- sets self.number to the given value in this case 2
                /  \
              2      6 <- sets self.number to the previous value + 1, in this case 2 + 1 = 3.

因此,自上次更改为self.number后,它应返回3.将其设置为3.我的代码就可以了。

另一个例子:

                  4
                /  \
              2      6
            /  \    / \
           1    3  5   7

tree = Node(5, Node(2, Node(1), Node(3)), Node(6, Node(5), Node(7)))
tree.set_number(5)

.set_number(5)对那棵树做了什么:

                  4  <- sets self.number to the given value, in this case 5
                /  \
              2      6  <- sets self.number to the previous self.number value + 1, in this case 5+1=6
            /  \    / \
           1    3  5   7 <- sets self.number to the previous self.number value + 1, in this case 6+1=7

因此,自上次更改为self.number后,它应该返回7.将其设置为7.我的代码就可以了。

但是这里我的代码似乎失败了:

                  4
                /  \
              2      6
            /  \    / \
           1    3  5   7
                        \
                         8     

tree = Node(5, Node(2, Node(1), Node(3)), Node(6, Node(5), Node(7, None, Node(8))))
tree.set_number(1)

它应该返回4,因为它将第一级设置为1,第二级设置为2,第三级设置为3,第四级设置为4,但是返回3而不是4.我想知道是否有人可以帮我搞清楚哪里出错了,我需要做些什么改变才能解决这个问题。

1 个答案:

答案 0 :(得分:1)

如果节点同时有左右孩子怎么办?在您的代码中,您有:

if self.left == None and self.right == None:
    ...
elif self.left:
    ...
elif self.right:
    ...

但是你会注意到,如果有一个左子项和右子项,elif self.left块将执行,但elif self.right块不会。将其更改为此应该有所帮助:

if self.left == None and self.right == None:
    ...
else
    if self.left:
        ...
    if self.right:
        ...