在二叉树中找到“叔叔” - Python

时间:2014-01-16 17:11:56

标签: python

我的任务是建立一个函数,它返回给定二叉树中“叔叔”的数量。只有当他的兄弟(他父亲的第二个孩子)有孩子时,节点才是叔叔。 这是我的代码: “

def uncle(root,count = None):
    if count is None:
        count = [0]
    a,b = 0,0
    if root.left:
        if root.left.left or root.left.right: 
            a = uncle(root.left)
            a = 1
    if root.right:
        if root.right.right or root.right.left:
            b = uncle(root.right)
            b = 1
    if b > 0:
        count[0] += 1
    if a > 0:
        count[0] += 1
    return count[0]

” 这是bin_tree类: “

Class bin_tree():
    def __init__(self,data, left_child = None, right_child = None):
        self.data = data
        self.left = left_child
        self.right = right_child

” 我的问题是: 当我切换线路时:             a =叔叔(root.left)             a = 1 它不起作用(意思=变量a由于某种原因将其值更改为0 ),我绝对不知道为什么......我认为它应该有效 如果我先调用函数递归或首先说a = 1,这没关系。 有人能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

我还没有对此进行测试,但它应该可行。你写的代码可以减少很多。

对于初学者来说,如果不是真的需要,你可以算作一个列表。

你的a和b永远不会被使用,所以没有必要为他们分配任何东西。这可能就是为什么你得到一个错误,无论你给a或b赋予什么价值。

然后你不需要检查a或b是否大于1.当你发现树中有另一个叔叔时,你可以增加计数。

然而,它不起作用的主要原因是每次你打电话给叔叔你都没有通过你的新计数。这意味着它将默认值设为None。然后,这会使列表重置为[0]。实际上,创建了一个新列表,它与前一个列表不同,即使它们具有相同的名称。因此,虽然您可能认为您正在更新相同的计数,但事实并非如此。这是一个范围问题。

def uncle(root,count=0):
    if root.left:
        if root.left.left or root.left.right: 
            count = uncle(root.left, count)
            count += 1
    if root.right:
        if root.right.right or root.right.left:
            count = uncle(root.right, count)
            count += 1
return count