如何递归地找到二叉树中节点的高度

Tur*_*dov 5 python algorithm binary-tree

path = 0 # the lenght of the path
    while self.right != None or self.left != None:
        while self.right != None:
            self = self.right
            path = path +1 
        while self.left != None:
            self = self.left
            path = path +1
    return path
Run Code Online (Sandbox Code Playgroud)

这是我查找高度的示例代码,定义为从自身到叶子的节点数量的最长路径的长度.叶节点的高度为1.

它不起作用.

mat*_*ata 20

你所做的不是递归的,它是迭代的.递归将是这样的:

def height(node):
    if node is None:
        return 0
    else:
        return max(height(node.left), height(node.right)) + 1
Run Code Online (Sandbox Code Playgroud)

  • @harishvc - 查看编辑历史记录,我有`返回-1`,这意味着一个叶子的高度为0(通常是如何定义树的高度),但是OP指定了_"的高度叶节点是1"_,所以这可能是我更改它的原因. (2认同)

Bit*_*ise 6

mata 为您提供了解决方案,但我建议您也查看您的代码并了解它在做什么:

    while self.right != None:
        self = self.right
        path = path +1
Run Code Online (Sandbox Code Playgroud)

这会做什么?它将找到正确的孩子,然后是它的正确孩子,依此类推。所以这只会检查“最右边”叶子的一条路径。

这对左侧执行相同的操作:

   while self.left != None:
        self = self.left
        path = path +1
Run Code Online (Sandbox Code Playgroud)

递归的想法是,对于每个子问题,您使用与所有其他子问题完全相同的方法来解决它。因此,如果您将算法仅应用于子树或叶子,它仍然可以工作。

此外,递归定义调用自身(尽管您可以使用循环来实现它,但这超出了此处的范围)。

记住定义:

递归:参见递归的定义。

;)


小智 5

def height(node):
    if node is None:
        return 0
    else:
        if node.left==None and node.right==None:
            return max(height(node.left), height(node.right))+0
        else:
            return max(height(node.left), height(node.right))+1
Run Code Online (Sandbox Code Playgroud)

如果您将每个增加的边视为高度。通过 hackerrank 测试用例