如何在BST中找到第k小的节点? (复查)

2024-05-20 15:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我昨天问了一个类似的问题,但是我得到了一个不同于原始问题的解决方案,所以我用新代码重新发布。我没有跟踪每个节点的右子节点和左子节点的数量。这段代码在某些情况下运行良好,但对于查找第6个最小元素的情况,它失败了。问题是我不知怎么的需要把孩子们的数量带到树上。例如,对于节点5,我需要遍历节点4的秩,但我不能这样做。在

这不是家庭作业,我在准备面试,这是一个经典的问题,我解决不了。在

class Node:
    """docstring for Node"""
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
        self.numLeftChildren = 0
        self.numRightChildren = 0


class BSTree:
    def __init__(self):
        # initializes the root member
        self.root = None

    def addNode(self, data):
        # creates a new node and returns it
        return Node(data)

    def insert(self, root, data):
        # inserts a new data
        if root == None:
            # it there isn't any data
            # adds it and returns
            return self.addNode(data)
        else:
            # enters into the tree
            if data <= root.data:
                root.numLeftChildren += 1
                # if the data is less than the stored one
                # goes into the left-sub-tree
                root.left = self.insert(root.left, data)
            else:
                # processes the right-sub-tree
                root.numRightChildren += 1
                root.right = self.insert(root.right, data)
            return root

    def getRankOfNumber(self, root, x, rank):
        if root == None:
            return 0
        if rank == x:
            return root.data
        else:
            if x > rank:
                return self.getRankOfNumber(root.right, x, rank+1+root.right.numLeftChildren)
            if x <= rank:
                return self.getRankOfNumber(root.left, x, root.left.numLeftChildren+1)


# main
btree = BSTree()
root = btree.addNode(13)
btree.insert(root, 3)
btree.insert(root, 14)
btree.insert(root, 1)
btree.insert(root, 4)
btree.insert(root, 18)
btree.insert(root, 2)
btree.insert(root, 12)
btree.insert(root, 10)
btree.insert(root, 5)
btree.insert(root, 11)
btree.insert(root, 8)
btree.insert(root, 7)
btree.insert(root, 9)
btree.insert(root, 6)

print btree.getRankOfNumber(root, 8, rank=root.numLeftChildren+1)

Tags: theselfrightnonedatareturnif节点
1条回答
网友
1楼 · 发布于 2024-05-20 15:28:30

你有一个节点的等级。你需要找到它的左或右子级的等级。那么,这个节点和它的子节点之间有多少个节点?在

     a
    / \
   /   \
  b     c
 / \   / \
W   X Y   Z

下面是一个BST示例,小写字母是节点,大写字母是子树。a和{}之间的节点数是X中的节点数。ac之间的节点数是Y中的节点数。因此,可以根据a的秩和{}或{}的大小来计算b或{}的秩。在

^{pr2}$

你有c公式,但是b公式是错误的。在

相关问题 更多 >