P4913 【深基16.例3】二叉树深度
题目描述
有一个 n(n≤106) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 n),建立一棵二叉树(根节点的编号为 1),如果是叶子结点,则输入 0 0。
建好这棵二叉树之后,请求出它的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。
输入格式
第一行一个整数 n,表示结点数。
之后 n 行,第 i 行两个整数 l、r,分别表示结点 i 的左右子结点编号。若 l=0 则表示无左子结点,r=0 同理。
输出格式
一个整数,表示最大结点深度。
输入输出样例
输入 #1复制
7 2 7 3 6 4 5 0 0 0 0 0 0 0 0
输出 #1复制
4
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] t = new int[n + 1][2]; for (int i = 1; i <= n; i++) { t[i][0] = sc.nextInt(); // 左子节点t[i][1] = sc.nextInt(); // 右子节点}int d = 0; // 树的深度Queue<Integer> q = new LinkedList<>(); // 队列,用于层序遍历(BFS)q.add(1); // 根节点入队(根的编号是1)while (!q.isEmpty()) {for (int i = q.size(); i > 0; i--) { // 遍历当前层的所有节点int x = q.poll(); // 出队一个节点if (t[x][0] != 0) q.add(t[x][0]); // 左子节点不为0则入队if (t[x][1] != 0) q.add(t[x][1]); // 右子节点不为0则入队}d++; // 当前层遍历完,深度+1}System.out.println(d); // 输出树的最大深度}
}
int[][] t = new int[n + 1][2];
我们用二维数组 t 来存二叉树:
t[i][0]表示第i个节点的左子节点编号t[i][1]表示第i个节点的右子节点编号
for (int i = q.size(); i > 0; i--)
一开始 q.size() 就是当前层的节点数
这层的节点全部出队后,就算一层遍历完;
