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

时间:2012-11-10 13:50:47

标签: 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

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

它不起作用。

6 个答案:

答案 0 :(得分:20)

你所做的不是递归的,而是迭代的。 递归将是这样的:

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

答案 1 :(得分:4)

mata给出了解决方案,但我建议您查看代码并了解它的作用:

    while self.right != None:
        self = self.right
        path = path +1

这会怎么做?它会找到合适的孩子,然后找到合适的孩子,依此类推。因此,这只检查“最右边”叶子的一条路径。

左边的情况也是如此:

   while self.left != None:
        self = self.left
        path = path +1

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

此外,递归定义会调用自身(虽然您可以使用循环实现此功能,但这超出了此范围)。

记住定义:

递归:参见递归的定义。

答案 2 :(得分:2)

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

如果您将每个增加的边缘视为高度。 通过hackerrank testcases

答案 3 :(得分:1)

def getHeight(self, root):
    if root == None:
        return -1
    else:
        return 1 + max( self.getHeight(root.left), self.getHeight(root.right) )

答案 4 :(得分:0)

这是Python ::

中的完整程序
class Node :
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

def maxDepth(node):
    if node is None :
        return 0
    else :
        ldepth = maxDepth(node.left)
        rdepth = maxDepth(node.right)

        if (ldepth>rdepth):
            return ldepth +1
        else :
            return rdepth +1

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)


print "Height of tree is %d" %(maxDepth(root))

来源:here

答案 5 :(得分:0)

def height(self):
    if self.root !=None:
        return self._height(self.root,0)
    else:
        return 0

def _height(self,cur_node,cur_height):
    if cur_node==None : 
         return cur_height
    left_height = self._height(cur_node.left_child,cur_height+1)
    right_height = self._height(cur_node.right_child,cur_height+1)
    return max(left_height,right_height)