简体   繁体   English

如何返回其值大于特定数字的节点列表

[英]how to return a list of nodes whose value are greater than a specific number

I'm trying to find all the nodes whose data is greater than the value using recursion.我正在尝试使用递归查找其数据大于该值的所有节点。 I learned from someone else that I should use Breadth-First Search but I'm still new to this algorithm.我从其他人那里了解到我应该使用广度优先搜索,但我对这个算法还是新手。 I've tried to return the first node that satisfies the requirement, but really don't know how to get the remaining ones.我试图返回满足要求的第一个节点,但真的不知道如何获得剩余的节点。 Can anyone help me figure out how to go through the child branches so that I can return a complete list?谁能帮我弄清楚如何通过子分支 go 以便我可以返回完整列表?

Some intended test cases can be:一些预期的测试用例可以是:

find_all(n2,200000) #Should return [N5, N7]
find_all(n1,200000) #Should return []
find_all(root,30000) #Should return [root, N1, N3, N4, N8, N2, N5, N6, N7]

The following code is how to build the tree and my partial code:以下代码是如何构建树和我的部分代码:

#The tree definition
class BinaryTreeNode:
    def __init__(self, name,data):
        self.name = name #The name of the node
        self.data = data #Data associated with the node
        self.leftChild = None #Left child
        self.rightChild = None #Right child
    
    #adds a left and right child to the node. Note that the left child is added first
    #I.e., there may be a left child without a right child but there cannot be a right child without a left child
    def add_children(self,left,right=None): 
        self.leftChild = left
        self.rightChild = right
        
    #str function for printing the contents of a node
    def __str__(self):
        rval = self.name
        if self.leftChild:
            rval += " Left: " + self.leftChild.name
        if self.rightChild:
            rval += " Right: " + self.rightChild.name
        return rval
    
    #repr function for internal representation
    def __repr__(self):
        return self.name
#Code for building the tree
root = BinaryTreeNode("root",33000)
n1 = BinaryTreeNode("N1",55000)
n2 = BinaryTreeNode("N2",120000)
n3 = BinaryTreeNode("N3",72000)
n4 = BinaryTreeNode("N4",88000)
n5 = BinaryTreeNode("N5",224000)
n6 = BinaryTreeNode("N6",56000)
n7 = BinaryTreeNode("N7",920000)
n8 = BinaryTreeNode("N8",183000)


root.add_children(n1,n2)
n1.add_children(n3,n4)
n4.add_children(n8)
n2.add_children(n5)
n5.add_children(n6,n7)

The following is my code to get the list of nodes, but I can only successfully return the first one (I know I should use recursion, but really have no idea about where to implement this technique):以下是我获取节点列表的代码,但我只能成功返回第一个(我知道我应该使用递归,但真的不知道在哪里实现这种技术):

def find(node,value):
# I think I should initialize a list at the first, this step should be correct
    result = []
    if node:  
        if node.data > value:
            result.append(node.name)
        else:
#I'm trying to find all nodes that go through the left children
            if find(node.leftChild, value):
                result.append(node.name)
# here the same thing, I'm trying to get all nodes in the right leaf
            if find(node.rightChild, value):
                result.append(node.name)
    return result

I also put the graph illustration in the following:我还将图表插图放在下面: 在此处输入图像描述

Try:尝试:

def find_all(node, value):
    if not node: # if node is None
        return []
    result = []
    if node.data > value:
        result.append(node.name)
    result += find_all(node.leftChild, value) # recursion; result will be a list
    result += find_all(node.rightChild, value)
    return result

print(find_all(n2,200000)) # ['N5', 'N7']
print(find_all(n1,200000)) # []
print(find_all(root,30000)) # ['root', 'N1', 'N3', 'N4', 'N8', 'N2', 'N5', 'N6', 'N7']

You only need to concatenate the results from the child trees, as those results would be lists of all node names (that satisfy the criterion) in the child trees.您只需要连接来自子树的结果,因为这些结果将是子树中所有节点名称(满足标准)的列表。

Or using a generator function:或使用发电机 function:

def find_all(node, value):
    if not node:
        return
    if node.data > value:
        yield node.name
    yield from find_all(node.leftChild, value)
    yield from find_all(node.rightChild, value)

print(list(find_all(n2,200000))) # ['N5', 'N7']
print(list(find_all(n1,200000))) # []
print(list(find_all(root,30000))) # ['root', 'N1', 'N3', 'N4', 'N8', 'N2', 'N5', 'N6', 'N7']

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 需要pyspark中值大于0的列列表 - Need columns list whose value is greater than 0 in pyspark 返回数字大于列表中前一个数字的次数 - Return amount of times a number is greater than previous number in a list Python二进制搜索类函数,用于查找排序列表中第一个大于特定值的数字 - Python binary search-like function to find first number in sorted list greater than a specific value 返回列表中大于某个值的项目列表 - Return list of items in list greater than some value 如果 item 为非数字或大于特定值,如何从列表列表中删除列表? - How do I remove list from list of lists if item is non-numeric or greater than a specific value? 如何计算列表中的数字大于其后的数字的次数? - How to count the number of times a number in a list is greater than the number after it? 从值大于特定值的数据框中创建列表 - Creating a list from data frame of value greater than a specific value 如何获取列子集中唯一值计数大于特定数字的列的列名 - How to get column names of columns with unique value count greater than a specific number within a subset of columns 如果差值大于某个值,则在列表中保留连续数字 - Keep consecutive number in list if the difference greater than a certain value 如何从 python 的数组中列出所有大于特定值的值 - How to list all values greater than a specific value from an array in python
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM