这是获取二叉树高度的好方法吗?

Is this a good way to get the height of a binary tree?

我不是 CS 学生,所以这不是家庭作业。我正在尝试自己学习这些东西,但我想确保自己没有在学习过程中养成坏习惯。

基本上,我有一个经典的二叉树,我想计算树的高度(或深度)。

我说的身高是这个图:

这棵树的高度是3。

这是我想出的python:

def height(node):

    #highest one of these two will be returned
    i_left = 0
    i_right = 0

    #if has left, increment and recursively move left
    if node.hasleft():
        i_left += height(node.left)
        i_left += 1

    #if has right, increment and recursively move right
    if node.hasright():
        i_right += height(node.right)
        i_right += 1

    #return the higher value
    if i_right <= i_left:
        return i_left    
    return i_right

这个解决方案很有效,我有点喜欢它,因为它很简单,没有很多抽象的东西需要你思考。但是,我确实想知道这是否应该这样做。有什么方法可以改进它,或者有更容易接受的实现高度函数的方法吗?

如果有子节点,您的代码只会将左节点或右节点的高度加1。即使没有子节点,也需要为当前节点加 1。所以它不应该在 if 块中。

def height(node):

    #if has left, recursively move left
    if node.hasleft():
        i_left = height(node.left)
    else:
        i_left = 0

    #if has right, recursively move right
    if node.hasright():
        i_right = height(node.right)
    else:
        i_right = 0

    #return the higher value, plus 1 for the current node.
    return 1 + max(i_left, i_right)

你的整体算法是最好的方法。

您无法知道哪个分支最长,因此唯一的方法是检查每条路径并找到最大值。您的递归结构似乎是非常经典的树结构!

你的算法的核心思想是合理和正确的;必须递归调用左右子树,加1.

假设你的 node.leftnode.right 属性分别是 None 当没有左子树或右子树时,可以通过只检查一次检查当前是否节点存在,而不是两次检查以查看其每个子节点是否存在。这意味着输入有时是 None,在这种情况下,正确的 return 值为 -1,因此叶节点的高度将为 0。

def height(node):
    if node is None:
        return -1
    else:
        i_left = height(node.left)
        i_right = height(node.right)
        return 1 + max(i_left, i_right)

或者,如果您是单线的粉丝:

def height(node):
    return -1 if node is None else 1 + max(height(node.left), height(node.right))

这里按照height的the usual definition作为从根节点到最长路径的边数,这样一棵有一个节点的树的高度为0。如果定义height为节点数那条路径,因此单节点树的高度为 1,然后只需将基本情况更改为 return 0 而不是 return -1.