二叉树的深度
描述
给定一棵二叉树,求该二叉树的深度
二叉树深度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的节点个数为树的深度
输入第一行是一个整数n,表示二叉树的结点个数。二叉树结点编号从1到n,根结点为1,n <= 10
接下来有n行,依次对应二叉树的n个节点。
每行有两个整数,分别表示该节点的左儿子和右儿子的节点编号。如果第一个(第二个)数为-1则表示没有左(右)儿子输出输出一个整型数,表示树的深度样例输入
3 2 3 -1 -1 -1 -1
样例输出
2
思想:对每个节点计算从根节点到此节点的深度,利用递归的算法,然后输出最大深度。
首先建一个树节点类型,包括左子树,右子树,深度。
然后把每个节点存储记录,之后求每个节点的深度。
求深度利用了递归的方式,从第一个节点开始,对每一个节点进行左右子树遍历(如果存在)
遍历过程中求其深度。
之后取最大值输出
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
// left, right分别表示左右儿子的编号
int left, right;
// dep表示该节点的深度,根为1
int dep;
} tree[1000];
int n;
// 通过递归来求每个节点的深度
// id和dep分别表示当前节点的编号和深度
void dfs(int id, int dep) {
tree[id].dep = dep;
// 如果左儿子存在
if (tree[id].left != -1)
dfs(tree[id].left, dep + 1);
// 如果右儿子存在
if(tree[id].right!=-1)
dfs(tree[id].right,dep + 1);
}
int main() {
int i;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
scanf("%d%d", &tree[i].left, &tree[i].right);
}
dfs(1, 1);
// 取所有节点深度的最大值
int ans = 0;
for (i = 1; i <= n; i++)
if(ans<tree[i].dep)
{
ans = tree[i].dep;
}
printf("%d\n", ans);
}