How to implement a binary search tree in Python?

前端 未结 18 2189
眼角桃花
眼角桃花 2020-11-30 22:25

This is what I\'ve got so far but it is not working:

class Node:
    rChild,lChild,data = None,None,None

    def __init__(self,key):
        self.rChild = N         


        
18条回答
  •  半阙折子戏
    2020-11-30 22:55

    The accepted answer neglects to set a parent attribute for each node inserted, without which one cannot implement a successor method which finds the successor in an in-order tree walk in O(h) time, where h is the height of the tree (as opposed to the O(n) time needed for the walk).

    Here is an implementation based on the pseudocode given in Cormen et al., Introduction to Algorithms, including assignment of a parent attribute and a successor method:

    class Node(object):
        def __init__(self, key):
            self.key = key
            self.left = None
            self.right = None
            self.parent = None
    
    
    class Tree(object):
        def __init__(self, root=None):
            self.root = root
    
        def insert(self, z):
            y = None
            x = self.root
            while x is not None:
                y = x
                if z.key < x.key:
                    x = x.left
                else:
                    x = x.right
            z.parent = y
            if y is None:
                self.root = z       # Tree was empty
            elif z.key < y.key:
                y.left = z
            else:
                y.right = z
    
        @staticmethod
        def minimum(x):
            while x.left is not None:
                x = x.left
            return x
    
        @staticmethod
        def successor(x):
            if x.right is not None:
                return Tree.minimum(x.right)
            y = x.parent
            while y is not None and x == y.right:
                x = y
                y = y.parent
            return y
    

    Here are some tests to show that the tree behaves as expected for the example given by DTing:

    import pytest
    
    @pytest.fixture
    def tree():
        t = Tree()
        t.insert(Node(3))
        t.insert(Node(1))
        t.insert(Node(7))
        t.insert(Node(5))
        return t
    
    def test_tree_insert(tree):
        assert tree.root.key == 3
        assert tree.root.left.key == 1
        assert tree.root.right.key == 7
        assert tree.root.right.left.key == 5
    
    def test_tree_successor(tree):
        assert Tree.successor(tree.root.left).key == 3
        assert Tree.successor(tree.root.right.left).key == 7
    
    if __name__ == "__main__":
        pytest.main([__file__])
    

提交回复
热议问题