首页 > 代码库 > 二叉树的深度

二叉树的深度

描述

给定一棵二叉树,求该二叉树的深度

二叉树深度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的节点个数为树的深度

输入第一行是一个整数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);
}

二叉树的深度