【问题标题】:Binary Search Tree in python not workingpython中的二叉搜索树不起作用
【发布时间】:2010-06-20 07:40:02
【问题描述】:
class Node:
    '''represents a new node in the BST'''
    def __init__(self,key):
        self.key=key
        self.disconnect()
    def disconnect(self):
        self.left=None;
        self.right=None;
        self.parent=None;
    def __str__(self):
        return 'node with kay %s'%self.key

class BST:
    def __init__(self):
        self.root=None
    def insert(self,t):
        '''inserts a new element into the tree'''
        self.find_place(self.root,t)

    def find_place(self,node,key):
        """finds the right place of the element recursively"""
        if node is None:
            node=Node(key)
            print node
        else:
            if node.key > key:
                find_place(node.left,key)
            else:
                find_place(node.right,key)
def test():
    '''function to test if the BST is working correctly'''

我写了上面的代码来实现一个二叉搜索树,但是插入方法没有按预期工作,它甚至无法添加根元素。我无法理解原因。

【问题讨论】:

标签: python algorithm binary-search-tree


【解决方案1】:

您实际上并没有向树中添加任何节点!

明确地管理根节点的添加是最简单的,正如您在下面的insert 中看到的那样。

find_place 函数可能会从名称中返回父节点,以及它是键的左槽还是右槽?我在下面创建了一个明确的_do_insert 函数,它既可以行走也可以插入。

从那时起,您需要遍历树,每次查看是否向下递归分支,或者是否到达了一个空槽,您可以在其中添加新节点。

重构代码以将遍历树(以及执行添加、删除等操作)的责任放入 Node 类可能是很自然的。

在下面的代码中,我忽略了添加一个已经在树中的键,我只是默默地退出:

def insert(self,t):
    '''inserts a new element into the tree'''
    if self.root is None:
        self.root = Node(t)
    else:
        self._do_insert(self.root,t)

def _do_insert(self,parent,t):
    if t > parent.key:
        if parent.left is None:
            parent.left = Node(t)
        else:
            self._do_insert(parent.left,t)
    elif t < parent.key:
        if parent.right is None:
            parent.right = Node(t)
        else:
            self._do_insert(parent.right,t)
    else:
        # raise a KeyError or something appropriate?
        pass

【讨论】:

    【解决方案2】:

    这是另一个使用 Python 的 BST,使用排序键

    左 = 0 右 = 1 价值 = 2 SORT_KEY = -1

    类 BinarySearchTree(对象):

    def __init__(self, sort_key=None):
        self._root = []  
        self._sort_key = sort_key
        self._len = 0  
    

    定义插入(自我,验证): 如果 self._sort_key 为无: sort_key = val // 如果没有排序键,排序键为值 别的: sort_key = self._sort_key(val)

    node = self._root
    while node:
        if sort_key < node[_SORT_KEY]:
            node = node[LEFT]
        else:
            node = node[RIGHT]
    
    if sort_key is val:
        node[:] = [[], [], val]
    else:
        node[:] = [[], [], val, sort_key]
    self._len += 1
    
    def minimum(self):
        return self._extreme_node(LEFT)[VALUE]
    
    def maximum(self):
        return self._extreme_node(RIGHT)[VALUE]
    
    def find(self, sort_key):
        return self._find(sort_key)[VALUE]
    
    def _extreme_node(self, side):
        if not self._root:
            raise IndexError('Empty')
        node = self._root
        while node[side]:
            node = node[side]
        return node
    
    def _find(self, sort_key):
        node = self._root
        while node:
            node_key = node[SORT_KEY]
            if sort_key < node_key:
                node = node[LEFT]
            elif sort_key > node_key:
                node = node[RIGHT]
            else:
                return node
        raise KeyError("%r not found" % sort_key)
    

    排序键被替换为值(如果有)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多