如何在二叉树中找到最小值和最大值
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 == 'main':
# 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
上的数据节点时。其他的(lis
和ris
)仅被称为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 有一个工作代码,他可以从那里扩展。
【讨论】:
以上是关于如何在二叉树中找到最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章