• 剑指Offer


    剑指Offer - 九度1350 - 二叉树的深度
    2013-11-23 00:54
    题目描述:

    输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

    输入:

    第一行输入有n,n表示结点数,结点号从1到n。根结点为1。 n <= 10。

    接下来有n行,每行有两个个整型a和b,表示第i个节点的左右孩子孩子。a为左孩子,b为右孩子。当a为-1时,没有左孩子。当b为-1时,没有右孩子。

    输出:

    输出一个整型,表示树的深度。

     
     
    样例输入:
    3
    2 3
    -1 -1
    -1 -1
    
    样例输出:
    2
    题意分析:
      题目要求求出二叉树的深度,也就是根节点到最远叶结点的长度。思路很清楚,DFS。
      递归关系为:
        max_depth(NULL) = 0;
        max_depth(r) = max(max_depth(r->left), max_depth(r->right)) + 1;
      实际上由于树的节点个数一开始就指定了,所以直接用数组存数据,用下标当指针就行了,coding更方便。题目中节点数n的数据范围居然只有10,我都怀疑应该是10000或者1000错写成10了。
      但有一点要注意,根节点如果不指定为1的话,是需要我们自己去判断哪个是根节点的。对于任何树结构,都只有根节点的入度为零,因为没有节点指向根节点。找出根节点才能去递归。
      每个节点遍历一次,时间复杂度O(n)。节点数据都要存起来,空间复杂度O(n)。
     1 // 654348    zhuli19901106    1350    Accepted    点击此处查看所有case的执行结果    1020KB    982B    0MS
     2 // 201311210410
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 int mymax(const int &a, const int &b)
     7 {
     8     return a > b ? a : b;
     9 }
    10 
    11 int max_depth(const int a[][2], int r)
    12 {
    13     if(a == NULL || r < 0){
    14         return 0;
    15     }
    16     
    17     return mymax(max_depth(a, a[r][0]), max_depth(a, a[r][1])) + 1;
    18 }
    19 
    20 int main()
    21 {
    22     const int MAXN = 20;
    23     int a[MAXN][2];
    24     int in_degree[MAXN];
    25     int i, n;
    26     
    27     while(scanf("%d", &n) == 1){
    28         if(n < 1){
    29             printf("0
    ");
    30             continue;
    31         }
    32         
    33         for(i = 1; i <= n; ++i){
    34             in_degree[i] = 0;
    35         }
    36         
    37         for(i = 1; i <= n; ++i){
    38             scanf("%d%d", &a[i][0], &a[i][1]);
    39             if(a[i][0] >= 1 && a[i][0] <= n){
    40                 ++in_degree[a[i][0]];
    41             }
    42             if(a[i][1] >= 1 && a[i][1] <= n){
    43                 ++in_degree[a[i][1]];
    44             }
    45         }
    46         
    47         for(i = 1; i <= n; ++i){
    48             if(in_degree[i] == 0){
    49                 break;
    50             }
    51         }
    52         printf("%d
    ", max_depth(a, i));
    53     }
    54     
    55     return 0;
    56 }
  • 相关阅读:
    API之绘图(转)
    API之子窗口创建 (转)
    函数调用规范__cdecl和__stdcall的区别一目了然(表格形式)(二)
    _cdecl 和_stdcall及其他调用方式 (一)
    sizeof的深入理解
    VC++中2进制,10进制,16进制相互转换
    传说中的数据结构
    字符串扩展
    数据结构实验之链表七:单链表中重复元素的删除
    数据结构实验之栈一:进制转换
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3438530.html
Copyright © 2020-2023  润新知