zoukankan      html  css  js  c++  java
  • 二叉树的深度

    题目链接:http://dsalgo.openjudge.cn/binarytree/11/

    总时间限制: 1000ms 内存限制: 65535kB
    描述

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

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

    输入
    第一行是一个整数n,表示二叉树的结点个数。二叉树结点编号从1到n,根结点为1,n <= 10
    接下来有n行,依次对应二叉树的n个节点。
    每行有两个整数,分别表示该节点的左儿子和右儿子的节点编号。如果第一个(第二个)数为-1则表示没有左(右)儿子
    输出
    输出一个整型数,表示树的深度
    样例输入
    3
    2 3
    -1 -1
    -1 -1
    样例输出
    2

    分析:

    这个题关键是要能够想到一个比较方便的存储二叉树的结构。构造好二叉树后,计算深度的话,广搜或深搜都可以。

    深搜:

     1 #include <stdio.h>
     2 int n,a[102][3];//a[i][0]表示节点i的左孩子节点编号,a[i][1]表示节点i的右孩子节点编号;a[i][2]表示i节点的父节点编号。
     3 int dfs(int root)//返回根节点编号为root的二叉树的高度 
     4 {
     5     if(a[root][0]==-1&&a[root][1]==-1) return 1;
     6     else 
     7     {
     8         int leftHeight=0,rightHeight=0;
     9         if(a[root][0]>0) leftHeight=dfs(a[root][0]);
    10         if(a[root][1]>0) rightHeight=dfs(a[root][1]);
    11         return (leftHeight>rightHeight?leftHeight:rightHeight)+1;
    12     }
    13 }
    14 int main()
    15 {
    16     freopen("data.in","r",stdin);
    17     int i,x,y;
    18     scanf("%d",&n);
    19     for(i=1;i<=n;i++)
    20     {
    21         scanf("%d%d",&x,&y);
    22         if(x>0)
    23         {
    24             a[i][0]=x;//i的左孩子是x 
    25             a[x][2]=i;//x的父节点是i 
    26         }
    27         if(y>0)
    28         {
    29             a[i][1]=y;//i的右孩子是y
    30             a[y][2]=i;//y的父节点是i 
    31         }
    32     }
    33     int ans=dfs(1);
    34     printf("%d
    ",ans);
    35     return 0;
    36 }
    View Code

    广搜:

     1 #include<iostream>
     2 #include<queue>
     3 using namespace std;
     4 
     5 int n,a[102][3];//a[i][0]表示节点i的左孩子节点编号,a[i][1]表示节点i的右孩子节点编号;a[i][2]表示i节点的父节点编号。
     6 struct obj
     7 {
     8     int ID;//节点编号
     9     int leval;//节点所在的层 
    10 };
    11 int bfs(int root)//用广搜的方式计算并返回根节点编号为root的二叉树的高度
    12 {
    13     struct obj ttt,t2;
    14     queue<struct obj> que;
    15     
    16     
    17     ttt.ID=root;
    18     ttt.leval=1;
    19     que.push(ttt);
    20     int maxHeight=1;
    21     while(!que.empty())
    22     {
    23         ttt=que.front();que.pop();
    24         
    25         if(a[ttt.ID][0]>0)
    26         {
    27             t2.ID=a[ttt.ID][0];
    28             t2.leval=ttt.leval+1;
    29             que.push(t2);
    30             if(t2.leval>maxHeight) maxHeight=t2.leval;
    31         }
    32         if(a[ttt.ID][1]>0)
    33         {
    34             t2.ID=a[ttt.ID][1];
    35             t2.leval=ttt.leval+1;
    36             que.push(t2);
    37             if(t2.leval>maxHeight) maxHeight=t2.leval;
    38         }
    39     }
    40     return maxHeight;
    41 } 
    42 int main()
    43 {
    44     int i,x,y;
    45     scanf("%d",&n);
    46     for(i=1;i<=n;i++)
    47     {
    48         scanf("%d%d",&x,&y);
    49         if(x>0)
    50         {
    51             a[i][0]=x;//i的左孩子是x 
    52             a[x][2]=i;//x的父节点是i 
    53         }
    54         if(y>0)
    55         {
    56             a[i][1]=y;//i的右孩子是y
    57             a[y][2]=i;//y的父节点是i 
    58         }
    59     }
    60     int ans=bfs(1);
    61     printf("%d
    ",ans);
    62     return 0;
    63 }
    View Code

    C++  STL的queue队列可以参考https://blog.csdn.net/qq_41785863/article/details/81630386 

  • 相关阅读:
    从docker容器拷贝文件出来
    R csv数据集资源下载
    使用docker镜像搭建Python3 jupyter notebook环境
    用Python合并多个Excel文件
    vscode保存文件时自动删除行尾空格
    js判断数组是否包含某元素
    数据库锁问题
    协程
    进程间的八种通信方式
    进程与线程的区别
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/11041180.html
Copyright © 2011-2022 走看看