Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找二叉搜索树最深和的函数_Python_Algorithm - Fatal编程技术网

Python 查找二叉搜索树最深和的函数

Python 查找二叉搜索树最深和的函数,python,algorithm,Python,Algorithm,我试图在python中创建一个函数,但我根本不想更改BST类来实现这一点。该函数用于查找根到具有最高深度的节点的路径之和。如果有多个节点具有相同的深度,我将查找最大深度和并返回它 到目前为止我得到了什么(使用基本的BST类) 类BTNode(对象): 在尝试了一段时间的算法来解决这个问题后,我想出了上面的几个方法,但都失败了,我不知道如何编写代码 算法: 我认为这是可行的: 我们从根开始。(我认为基本情况应该是每当我们击中一片叶子时,比如在一个节点中没有子节点,所以没有左或右子节点,以及当有左无

我试图在python中创建一个函数,但我根本不想更改BST类来实现这一点。该函数用于查找根到具有最高深度的节点的路径之和。如果有多个节点具有相同的深度,我将查找最大深度和并返回它

到目前为止我得到了什么(使用基本的BST类)

类BTNode(对象):

在尝试了一段时间的算法来解决这个问题后,我想出了上面的几个方法,但都失败了,我不知道如何编写代码

算法:

我认为这是可行的:

我们从根开始。(我认为基本情况应该是每当我们击中一片叶子时,比如在一个节点中没有子节点,所以没有左或右子节点,以及当有左无右,或者有右无左)

我先检查左子树,得到它的深度,我们也可以用和来称它为深度。然后我检查正确的子树,我们称之为深度,然后得到它的深度及其总和

第二个条件是检查它们是否相等,如果相等,那么很容易,我们只取两个深度的最大和。否则,我们将看到谁拥有最高的深度,并试图得到它的总和

现在是我不知道该怎么做的时候了

1:我从来没有学过可选参数,所以在尝试这个练习时,我试图避免这种情况,但我认为我做不到,我真的很感激有人能给我展示一些很酷的助手函数

2:这不是右边或左边的总和,而是我需要的路径。想到一种方法来获得正确的路径有点让人困惑

(以下是我使用上述算法的新尝试):

粘在我提到的零件上。举个例子:

>>> BST(8, BST(7, BST(10), BST(11)), BST(6, BST(11), BST(9, None, BST(14)))

37  (depth 3 is the highest so 8 + 6 + 9 + 14 is the path) 
对不起,我把BST忘了,它是一个二叉树而不是BST


我知道我的函数会给出一个元组,但我总是可以制作一个帮助函数来修复这个问题,我只是觉得跟踪节点会更容易

如果函数不需要是
BTNode
的方法,则可以大大简化实现。然后,您可以跟踪深度和总和,遍历叶并返回当前深度和总和。此外,如果返回
(深度,总和)
元组,则可以使用
max
直接将它们相互比较:

class BTNode(object):
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

def deepest_sum(node, depth=0, current=0):
    # Base case
    if not node:
        return (depth, current)

    depth += 1
    current += node.data

    return max(deepest_sum(node.left, depth, current), 
               deepest_sum(node.right, depth, current))

tree = BTNode(8, BTNode(7, BTNode(10), BTNode(11)), BTNode(6, BTNode(11), BTNode(9, None, BTNode(14))))
print(deepest_sum(tree))
输出:

(4, 37)
class BTNode(object):
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

def deepest_sum(node, depth=0, current=0):
    # Base case
    if not node:
        return (depth, current)

    depth += 1
    current += node.data

    return max(deepest_sum(node.left, depth, current), 
               deepest_sum(node.right, depth, current))

tree = BTNode(8, BTNode(7, BTNode(10), BTNode(11)), BTNode(6, BTNode(11), BTNode(9, None, BTNode(14))))
print(deepest_sum(tree))
(4, 37)