zoukankan      html  css  js  c++  java
  • 二叉树高度(bfs水题)

    题目描述:给出每个节点的两个儿子节点,建立一棵二叉树,如果是叶子节点,则输入0 0。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。

    最多有 10^6 个结点。

    输入:

    7
    2 7
    3 6
    4 5
    0 0
    0 0
    0 0
    0 0

    输出:

    4

    分析:给你一颗树,求它的最大深度,第一反应就是dfs,但是一看数据量10^6次直接就被劝退了,转而想写bfs,我个人认为,在类似于跑最大深度的问题上,bfs要比dfs效率高(蒟蒻理解),因为dfs要不断回溯,

    所以效率不高,bfs按层序遍历,效率较高,由于本人水平有限,没有用手写队列,用了std.

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
        int left=-1;
        int right=-1;//用-1来表示无节点,和0区别开
        int step;
    } e[100005];
    int n;
    int total;
    queue<node> q;
    void bfs(int i)
    {
        node a;
        a.left=e[i].left;
        a.right=e[i].right;
        a.step=1;
        q.push(a);
        while(!q.empty())
        {
            node c=q.front();
            q.pop();
            int x=c.left;
            int y=c.right;
            int z=c.step;
            total=max(z,total);
            if(x==-1)
                continue;
            if(y==-1)
                continue;
            if(x!=0)
            {
                node b;
                b.left=e[x].left;
                b.right=e[x].right;
                b.step=z+1;//这里不能z++
                q.push(b);
            }
            if(y!=0)
            {
                node b;
                b.left=e[y].left;
                b.right=e[y].right;
                b.step=z+1;
                q.push(b);
            }
        }
    }
    int main()
    {
    
        cin>>n;
        for(int i=1; i<=n; i++)
        {
            int x,y;
            cin>>x>>y;
            e[i].left=x;
            e[i].right=y;
        }
        bfs(1);
        cout<<total;
        return 0;
    }
  • 相关阅读:
    fileupload直接获得
    ajax分页
    jquery.cookie.js
    DataTable分页
    C#字串与Unicode互相转换方法
    Linq测试
    滚动条加载数据
    创建.PDF文件【1】
    小问题【6】
    小问题【4】
  • 原文地址:https://www.cnblogs.com/iloveysm/p/12333475.html
Copyright © 2011-2022 走看看