目录
题目描述
有一个 n(n≤106) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 n),建立一棵二叉树(根节点的编号为 1),如果是叶子结点,则输入 0 0
。
建好这棵二叉树之后,请求出它的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。
输入格式
第一行一个整数 n,表示结点数。
之后 n 行,第 i 行两个整数 l、r,分别表示结点 i 的左右子结点编号。若 l=0 则表示无左子结点,r=0 同理。
输出格式
一个整数,表示最大结点深度。
输入输出样例
输入
7
2 7
3 6
4 5
0 0
0 0
0 0
0 0
输出
4
代码
无注释版
#include <stdio.h>
#include <malloc.h>
struct Node{
int num;
int depth;
Node *parent;
Node *left;
Node *right;
};
Node* CreatNode(){
int c;
scanf("%d",&c);
Node* rt=(Node*)malloc(sizeof(Node));
if(c!=0){
rt->num=c;
rt->left=CreatNode();
rt->right=CreatNode();
}
else rt=NULL;
return rt;
}
int depth(Node* rt){
if(rt==NULL) return 0;
int m1=depth(rt->left);
int m2=depth(rt->right);
if(m1<m2) m1=m2;
return 1+m1;
}
int main(){
int n;
scanf("%d",&n);
Node* rt=(Node*)malloc(sizeof(int));
rt=CreatNode();
printf("%d",depth(rt));
}
有注释版
#include <stdio.h> // 引入标准输入输出库
#include <malloc.h> // 引入动态内存分配库
// 定义一个Node结构体,表示二叉树的每个节点
struct Node{
int num; // 该节点的编号
int depth; // 该节点的深度
Node *parent; // 父节点指针(此题未使用)
Node *left; // 左子节点指针
Node *right; // 右子节点指针
};
// 创建一个新节点并递归构建二叉树
Node* CreatNode(){
int c;
scanf("%d", &c); // 读取节点编号
Node* rt = (Node*)malloc(sizeof(Node)); // 为新节点分配内存
if(c != 0){ // 如果节点编号不为0,则该节点有效
rt->num = c; // 设置节点编号
rt->left = CreatNode(); // 递归创建左子树
rt->right = CreatNode(); // 递归创建右子树
}
else
rt = NULL; // 如果节点编号为0,表示没有子节点,返回NULL
return rt; // 返回当前节点
}
// 计算树的深度
int depth(Node* rt){
if(rt == NULL) // 如果节点为空,深度为0
return 0;
// 递归计算左子树的深度
int m1 = depth(rt->left);
// 递归计算右子树的深度
int m2 = depth(rt->right);
// 取左子树和右子树的最大深度
if(m1 < m2)
m1 = m2;
// 当前节点深度为1加上左右子树的最大深度
return 1 + m1;
}
int main(){
int n;
scanf("%d", &n); // 读取节点总数
Node* rt = (Node*)malloc(sizeof(int)); // 创建根节点的内存空间
rt = CreatNode(); // 通过递归创建二叉树
printf("%d", depth(rt)); // 输出树的最大深度
}