python實現二叉查找樹的查找、插入、刪除操作

本文用python3實現二叉查找樹的查找、插入、刪除操作。

完整代碼:https://github.com/toanoyx/BasicAlgorithm/tree/master/tree

查找

查找操作:先取根節點,如果它等於要查找的數那就返回。如果要查找的數比根節點的值小,就在左子樹中遞歸查找;如果要查找的數比根節點的值大,那就在右子樹中遞歸查找。

    def search(self, data):
        res = []
        node = self.root
        while node:
            if data < node.val:
                node = node.left
            else:
                if data == node.val:
                    res.append(node)
                node = node.right
        return res

插入

插入操作:從根節點開始,依次比較要插入的數據與節點的大小關係。如果插入的數據比節點的大,並且節點的右子樹爲空,就將數據直接插到右子節點的位置;如果右子樹不爲空,就在遞歸遍歷右子樹,查找插入位置。如果要插入的數據比節點的小,並且節點的左子樹爲空,就將數據直接插到左子樹的位置;如果左子樹不爲空,就再遞歸遍歷左子樹,查找插入位置。

    def insert(self, data):
        if self.root is None:
            self.root = TreeNode(data)
        else:
            node = self.root
            while node:
                p = node
                if data < node.val:
                    node = node.left
                else:
                    node = node.right
            new_node = TreeNode(data)
            new_node.parent = p
            if data < p.val:
                p.left = new_node
            else:
                p.right = new_node
        return True

刪除

刪除操作:分三種情況進行討論。

①要刪除的節點沒有子節點:直接將父結點中指向要刪除節點的指針置爲null。

②要刪除的節點只有一個子節點(只有左子節點或者右子節點):更新父節點中,指向要刪除節點的指針,讓它指向要刪除節點的子節點即可。

③要刪除的節點有兩個子節點:首先找到要刪除節點的右子樹中的最小節點,把它的值替換到要刪除的節點上。然後再刪除掉這個最小節點即可。

    def _del(self, node):
        # 1
        if node.left is None and node.right is None:
            if node == self.root:
                self.root = None
            else:
                if node.val < node.parent.val:
                    node.parent.left = None
                else:
                    node.parent.right = None
                node.parent = None
        # 2
        elif node.left is None and node.right is not None:
            if node == self.root:
                self.root = node.right
                self.root.parent = None
                node.right = None
            else:
                if node.val < node.parent.val:
                    node.parent.left = node.right
                else:
                    node.parent.right = node.right
                node.right.parent = node.parent
                node.parent = None
                node.right = None
        elif node.left is not None and node.right is None:
            if node == self.root:
                self.root = node.left
                self.root.parent = None
                node.left = None
            else:
                if node.val < node.parent.val:
                    node.parent.left = node.left
                else:
                    node.parent.right = node.left
                node.left.parent = node.parent
                node.parent = None
                node.left = None
        # 3
        else:
            min_node = node.right
            if min_node.left:
                min_node = min_node.left
            if node.val != min_node.val:
                node.val = min_node.val
                self._del(min_node)
            else:
                self._del(min_node)
                self._del(node)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章