如何在二叉树中找到最小值和最大值

Posted

技术标签:

【中文标题】如何在二叉树中找到最小值和最大值【英文标题】:How to find the minimum, and maximum value within a Binary Tree 【发布时间】:2021-01-23 01:27:14 【问题描述】:

++编辑++

感谢大家,我花了很多时间来让代码最终工作。

这是完整的代码概览

class Node:
# Binary Roots: Left and Right, initiating data
def __init__(self, data):
    # Creating an object, Data, to be used for inputs
    self.data = data
    # The objects are defined as None, which creates an empty space for input
    self.left = None
    self.right = None

定义二叉树类:

类二叉树:

# Defining Roots as Nodes, initiating at the same time.
def __init__(self, rootdata):
    # Declaring roots as new nodes which uses root data
    self.root = Node(rootdata)

定义FindMax,在二叉树中求最大值,然后返回最大值。

def FindMax(root):

# ???
if (root == None):
    return float('-inf')

# In this function, it will search for the maximum of three values, the roots, and maximums from left and right leaves.

# Initialization of 3 things: the maximum of root, and two maximums of left and right leaves
letsfind = root.data
lfound = FindMax(root.left)
rfound = FindMax(root.right)

# If a maximum is found on the left, new maximum is the value.
if(lfound > letsfind):
    letsfind = lfound

# If a maximum is found on the right, new maximum is the value.
if(rfound > letsfind):
    letsfind = rfound

# Return the maximum value found.
return letsfind

???

如果 name == 'ma​​in':

# The Inputs of the Binary Tree and leaves.
# root (Top most), root.left (Left Leaf), root.right (Right Leaf)
root = Node(2)
root.left     = Node(7)  
root.right     = Node(5)  
root.left.right = Node(6)  
root.left.right.left= Node(1)  
root.left.right.right= Node(11)  
root.right.right= Node(9)  
root.right.right.left= Node(4)  

# Print the Maximum
print("The Maximum Value in the Binary Tree is: ", FindMax(root))
    

我知道它看起来很长,所以我很抱歉。 我已经考虑到函数“FindMax”需要在类之外才能正常运行。

还有一件事,声明if __name__ == '__main__':的目的是什么?

if (root == None): return float('-inf') 的真正用途是什么?

非常感谢各位。我很感激! :)

【问题讨论】:

比较数据到数据,而不是节点到数据if (lis.data > st): 【参考方案1】:
lis = FindMax(start.left) 
ris = FindMax(start.right) 

你忘了调用递归搜索

【讨论】:

感谢您的更正,但它显示名称“FindMax”未定义【参考方案2】:

选项 1

问题来了

st = start.data
lis = start.left
ris = start.right

当您实际调用st 上的数据节点时。其他的(lisris)仅被称为Nodes。你应该改变它

st = start.data
lis = (start.left).data
ris = (start.right).data

从所有节点读取数据

选项 2

您为您的节点类覆盖 >

有趣但不适合新手。如果你有兴趣开始阅读this

【讨论】:

这是我在行底部的内容,' print(Tree.FindMax(Tree.root)) ' 它说没有定义名称'FindMax' 你应该派全班来帮你 你应该派全班来帮你。但是,如果您在Node 中定义fmax,则应将其称为self.fmax(),否则您将调用我认为您没有的全局函数fmax。如果这是您的情况@Raymond C. 答案应该对您有所帮助【参考方案3】:

这是正确的代码:

def findMax(start): 
      
    # Base case  
    if start is None:  
        return float('-inf') 

    st = start.data 
    lis = findMax(start.left)  
    ris = findMax(start.right)  
    
    if (lis > st): 
        st = lis  
    if (ris > st):  
        st = ris  
    
    return st

现在调用 findMax()


Tree=BinaryTree("1")
Tree.root.left=Node("2")
Tree.root.right=Node("3")
Tree.root.left.left=Node("4")
Tree.root.left.right=Node("5")
Tree.root.right.left=Node("6")
Tree.root.right.right=Node("7")
Tree.root.right.right.right=Node("8")
print("Maximum element is",  findMax(start)) 

【讨论】:

它一直告诉我名称“FindMax”未定义,有什么想法吗?【参考方案4】:
def findMax(root): 
      
    if (root == None):  
        return float('-inf') 

    res = root.data 
    lres = findMax(root.left)  
    rres = findMax(root.right)  
    if (lres > res): 
        res = lres  
    if (rres > res):  
        res = rres  
    return res 
  
if __name__ == '__main__': 
    root = newNode(2)  
    root.left = newNode(7)  
    root.right = newNode(5)  
    root.left.right = newNode(6)  
    root.left.right.left = newNode(1)  
    root.left.right.right = newNode(11)  
    root.right.right = newNode(9)  
    root.right.right.left = newNode(4)  
  
    print("Maximum element is", findMax(root)) 

#输出

最大元素为 11

【讨论】:

【参考方案5】:

注意 - 我的回答有一些例外:

它可能包含错误,因为 OP 没有提供 BinaryTree 类。 不考虑任何逻辑问题。 它专注于让 OP 的代码正常工作。

以下是我发现的错误:

Python 是一种需要适当缩进的语言。缩进对于代码正常运行至关重要。您的代码缩进方式似乎不正确。 当您尝试调用类中的函数时,您需要通过实例(self)或类本身(classmethods)进行调用。 Explanation provided here. if __name__ == "__main__":here 的解释。它不是真正需要的,因为我假设您的代码是单个模块(在一个 Python 文件中),但在使用多个模块时很好。

根据我提到的几点,我已相应地更正了您的代码,如下所示:

# Any required imports goes here...
# import XXX


class BinaryTree:
    # OP did not provide code sample...


class Node:
    def __init__(self, data):

        # Creating a node
        self.data = data

        # Pointing either left or right, but it is empty in default
        self.left = None
        self.right = None

    def fmax(self, start):
        
        if start is None:
            return 0

        st = start.data

        lis = self.fmax(start.left)
        ris = self.fmax(start.right)

        if (lis > st):
            st = lis
        if (ris > st):
            st = ris

        return st


if __name__ == "__main__":

    Tree = BinaryTree("1")
    Tree.root.left = Node("2")
    Tree.root.right = Node("3")
    Tree.root.left.left = Node("4")
    Tree.root.left.right = Node("5")
    Tree.root.right.left = Node("6")
    Tree.root.right.right = Node("7")
    Tree.root.right.right.right = Node("8")

    print(Tree.fmax(Tree.root))

如果有人发现我的代码有任何错误,请随时编辑。我的想法是让 OP 有一个工作代码,他可以从那里扩展。

【讨论】:

以上是关于如何在二叉树中找到最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章

《算法导论》读书笔记

在递归二叉树函数中返回元组时遇到问题

二叉树:搜索树的最小绝对差

二叉树每个节点有一个权值,给定一棵二叉树,求权值和最大的值

以最优方式在二叉搜索树中找到第 k 个最小元素

Geeks LCA最低公共单亲节点