【问题标题】:Why I get None when calling this method?为什么调用此方法时我得到 None ?
【发布时间】:2020-10-05 23:43:13
【问题描述】:

我想编写方法mirror() 创建并返回二叉树,其中所有左子树都变为右子树,反之亦然。我试图用递归来做到这一点:

def mirror(self):
    if self.left == None and self.right == None:
        return
    elif self.left == None and self.right != None:
        t = self.right
        self.right = self.left
        self.left = t
        self.left.mirror()
    elif self.left != None and self.right == None:
        t = self.right
        self.right = self.left
        self.left = t
        self.right.mirror()
    else:
        t = self.right
        self.right = self.left
        self.left = t
        self.left.mirror()
        self.right.mirror()

但是我得到了输出None。为什么,以及如何解决?

【问题讨论】:

  • 我在整个函数中只看到一个return。如果你不告诉它,它怎么知道返回什么?
  • 还有那个return returns None。除了None 之外,您如何期待这个函数return
  • 它不会返回一个新的反转树;它将原树反转到位。

标签: python oop recursion binary-tree


【解决方案1】:

您当前的功能将所有分支就地交换;没有特别需要返回树,因为如果您首先设法调用该方法,那么您已经有了对它的引用。但如果你想返回这样的引用,你可以:

def mirror(self):
    if self.left == None and self.right == None:
        pass
    elif self.left == None and self.right != None:
        t = self.right
        self.right = self.left
        self.left = t
        self.left.mirror()
    elif self.left != None and self.right == None:
        t = self.right
        self.right = self.left
        self.left = t
        self.right.mirror()
    else:
        t = self.right
        self.right = self.left
        self.left = t
        self.left.mirror()
        self.right.mirror()
    return self

或更简单地说:

def mirror(self):
    if self.left is not None:
        self.left.mirror()
    if self.right is not None:
        self.right.mirror()
    self.left, self.right = self.right, self.left
    return self

另一方面,如果您想要一个独立于原始树的树,则需要构造一个返回。

def mirror(self):
    new_tree = ...  # Whatever you do to create a root node from the root of self

    # If the child pointers aren't already None after creating the node
    new_tree.left = None
    new_tree.right = None

    if self.right is not None:
        new_tree.left = self.right.mirror()
    if self.left is not None:
        new_tree.right = self.left.mirror()

    return new_tree

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多