Skip to content

27638: 求二叉树的高度和叶子数目

http://cs101.openjudge.cn/practice/27638/

给定一棵二叉树,求该二叉树的高度和叶子数目二叉树高度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的结点数减1为树的高度。只有一个结点的二叉树,高度是0。

输入

第一行是一个整数n,表示二叉树的结点个数。二叉树结点编号从0到n-1,根结点n <= 100 接下来有n行,依次对应二叉树的编号为0,1,2....n-1的节点。 每行有两个整数,分别表示该节点的左儿子和右儿子的编号。如果第一个(第二个)数为-1则表示没有左(右)儿子

输出

在一行中输出2个整数,分别表示二叉树的高度和叶子结点个数

样例输入

3
-1 -1
0 2
-1 -1

样例输出

1 2

来源

http://dsbpython.openjudge.cn/dspythonbook/P0610/

由于输入无法分辨谁为根节点,所以写寻找根节点语句。

python
class TreeNode:
    def __init__(self):
        self.left = None
        self.right = None

def tree_height(node):
    if node is None:
        return -1  # 根据定义,空树高度为-1
    return max(tree_height(node.left), tree_height(node.right)) + 1

def count_leaves(node):
    if node is None:
        return 0
    if node.left is None and node.right is None:
        return 1
    return count_leaves(node.left) + count_leaves(node.right)

n = int(input())  # 读取节点数量
nodes = [TreeNode() for _ in range(n)]
has_parent = [False] * n  # 用来标记节点是否有父节点

for i in range(n):
    left_index, right_index = map(int, input().split())
    if left_index != -1:
        nodes[i].left = nodes[left_index]
        has_parent[left_index] = True
    if right_index != -1:
        #print(right_index)
        nodes[i].right = nodes[right_index]
        has_parent[right_index] = True

# 寻找根节点,也就是没有父节点的节点
root_index = has_parent.index(False)
root = nodes[root_index]

# 计算高度和叶子节点数
height = tree_height(root)
leaves = count_leaves(root)

print(f"{height} {leaves}")