【问题标题】:Returning function result inside class, how it works?在类中返回函数结果,它是如何工作的?
【发布时间】:2019-06-27 08:29:11
【问题描述】:
if not node:
    return node

这段代码是什么意思?

if not node.leftchild:
    print('removing the node with single rightchild')
    tempnode = node.rightchild
    del node
    return tempnode

在二叉搜索树中有一个子节点的情况下删除项目,如果一个节点被删除,子节点需要连接到另一个节点。但是,我不明白它是如何工作的,因为没有指向另一个节点的声明。返回后“tempnode”如何工作?我的意思是返回后没有任何用途,但我看看我是否返回 None 或其他值而不是 tempnode,删除不起作用

这是完整的程序。

class Node:

    def __init__(self,data):
        self.data = data
        self.leftchild = None
        self.rightchild = None


class BinarySearchTree:

    def __init__(self):
        self.root = None

    def insert(self, data):
        if not self.root:
            self.root = Node(data)

        else:
            self.insert_node(data,self.root)

    def insert_node(self,data, node):

        if data < node.data:
            if node.leftchild:
                self.insert_node(data, node.leftchild)
            else:
                node.leftchild = Node(data)
        else:
            if node.rightchild:
                self.insert_node(data, node.rightchild)
            else:
                node.rightchild = Node(data)

    def remove(self, data):
        if self.root:
            self.root = self.remove_node(data, self.root)

    def remove_node(self, data, node):
        if not node:
            return node

        if data < node.data:
            node.leftchild = self.remove_node(data, node.leftchild)

        elif data > node.data:
            node.rightchild = self.remove_node(data, node.rightchild)

        else:

            if not node.leftchild and not node.rightchild:
                print('removing leaf node')
                del node
                return None

            if not node.leftchild:
                print('removing the node with single rightchild')
                tempnode = node.rightchild
                del node
                return tempnode

            elif not node.rightchild:
                print('removing the node with single lefttchild')
                tempnode = node.leftchild
                del node

                return tempnode

            print('removing the node with two childs')
            tempnode = self.get_predessor(node.leftchild)
            node.data = tempnode.data
            node.leftchild = self.remove_node(tempnode.data, node.leftchild)


        return node

    def get_predessor(self, node):

        if node.rightchild:
            return self.get_predessor(node.rightchild)

        return node




    def get_min_value(self):
        if self.root:
            return self.get_min(self.root)

    def get_min(self, node):
        if node.leftchild:
            return self.get_min(node.leftchild)

        return node.data

    def get_max_value(self):
        if self.root:
            return self.get_max(self.root)

    def get_max(self, node):
        if node.rightchild:
            return self.get_max(node.rightchild)
        return node.data

    def traverse(self):
        if self.root:
            self.traverse_in_order(self.root)

    def traverse_in_order(self, node):
        if node.leftchild:
            self.traverse_in_order(node.leftchild)

        print(node.data)

        if node.rightchild:
            self.traverse_in_order(node.rightchild)

【问题讨论】:

    标签: python python-3.x binary-search-tree


    【解决方案1】:

    remove_node 是一个递归函数。这段代码被设计成当给定数据等于节点(子)的数据时,删除它并获取它的子/ren(Grandchild/ren)并将它们分配给父节点的子字段。 tempnode 返回到之前的递归。

    在这里完成

    if data < node.data:
        node.leftchild = self.remove_node(data, node.leftchild)
    
    elif data > node.data:
        node.rightchild = self.remove_node(data, node.rightchild)
    

    这里

    print('removing the node with two childs')
    tempnode = self.get_predessor(node.leftchild)
    node.data = tempnode.data
    node.leftchild = self.remove_node(tempnode.data, node.leftchild)
    

    【讨论】:

    • 是的,第一个问题(if not node: return node 的含义)的答案是可读性 - 它看起来比 if node: 更好,并且下面的所有代码都缩进了 4 个空格。
    • 感谢您的回答。但是我还有一点不清楚..返回“tempnode”时函数不是结束了吗?怎么回到前面?
    • remove_node 调用另一个 remove_node 调用另一个 remove_node 并且这样继续下去。是的,函数在return tempnode 执行时结束,之后调用者remove_node 继续执行。找到一个关于递归的教程并检查它是如何在 Python 中完成的,只有这样你才会发现这个代码是合理的。
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多