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}")