P4913 【深基16.例3】二叉树深度

目录

题目描述

输入格式

输出格式

输入输出样例

代码

无注释版

有注释版


题目描述

有一个 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));  // 输出树的最大深度
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值