二进制搜索树,试图实现删除节点方法,不了解基础知识

时间:2016-06-29 23:55:03

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

坐了一会儿,如果有人知道,请帮帮忙。 我有一个二元搜索树类,我想实现一个删除功能,查找后,我找到了一个,我试图理解它,但我意识到我只是不能。代码看起来像这样:

class Treenode:
    def __init__(self,data,left=None,right=None):
        self.data=data
        self.left=left
        self.right=right

    def __str__(self):
        return str(self.data)

    def delete(self):
        child=self.left
        grandchild=child.right
        if self.left == self.right==None:
            return None
        if self.left==None:
            return self.right
        if self.right==None:
            return self.left
        if grandchild:
            while grandchild.right:
                child = grandchild
                grandchild = child.right
            self.data = grandchild.data
            child.right = grandchild.left
        else:
            self.left = child.left
            self.data = child.data
        return self

class Bintree:
    def __init__(self):
        self.root = None

    def put(self,data):
        if self.root == None:
            self.root = Treenode(data)
            return
        p = self.root
        while True:
            if data < p.data:
                if p.left == None:
                    p.left = Treenode(data)
                    return
                else:
                    p = p.left
            elif data > p.data:
                if p.right == None:
                    p.right = Treenode(data)
                    return
                else:
                    p = p.right
            elif data == p.data:
                return False
            else:
                return

    def exists(self, data):
        return finns(self.root, data)

    def isempty(self):
        return self.root == None

    def height(self):
        def hp(tree):
            if tree is None:
                return 0
            else:
                return 1 + max(hp(tree.left), hp(tree.right))
        return hp(self.root)

    def printTree(self):
        skriv(self.root)

    def remove(self, data):
        if self.root and self.root.data == data:  #self.root kanske inte behövs, undersök
            self.root = self.root.delete()
            return
        else:
            parent = self.root
            while parent:
                if data < parent.data:
                    child = parent.left
                    if child and child.data== data:
                        parent.left = child.delete()
                        return
                    parent = child
                else:
                    child = parent.right
                    if child and child.data == data:
                        parent.right = child.delete()
                        return
                    parent = child



def skriv(tree):
    if tree == None:
        return
    skriv(tree.left)
    print(tree.data)
    skriv(tree.right)

def finns(roten, key):
    if roten == None:
        return False
    if key == roten.data:
        return True
    elif key < roten.data:
        return finns(roten.left, key)
    else:
        return finns(roten.right, key)

我正在使用以下代码创建二进制搜索:

from labb8test import Bintree

tree = Bintree()    
tree.put(8)    
tree.put(3)
tree.put(1)
tree.put(6)
tree.put(4)
tree.put(7)
tree.put(10)
tree.put(14)
tree.put(13)
tree.remove(14)
tree.printTree()

我的问题是Treenode类下的delete-method。我试图在纸上画它,有人可以解释一下,while循环是如何工作的? grandchild.right,是因为我已经在上面定义了这些必要的代码...感谢此时的任何帮助!

0 个答案:

没有答案