首页 > 其他分享 >【二叉树】用数组给出二叉树层序遍历序列,建树以及遍历问题

【二叉树】用数组给出二叉树层序遍历序列,建树以及遍历问题

时间:2025-01-23 19:53:36浏览次数:1  
标签:遍历 dist idx int 层序 ne 二叉树

传递悄悄话

image

层序遍历数组形式的下标如下
image


#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 1010, M = N * 2;

int n;
int h[N], e[M], ne[M], idx;
int v[N], dist[N];
bool st[N];

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void dfs(int u)
{
    st[u] = true;
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j]) 
        {
            dist[j] = dist[u] + v[j];
            dfs(j);
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    memset(h, -1, sizeof h);
    int x;
    while (cin >> x) v[++n] = x;
    for (int i = 1; i <= n / 2; i++)//二叉树的最后一个分支(非叶)节点为n/2
    {
        if (v[i] == -1) continue;
        int a = i * 2, b = i * 2 + 1;
        //若下标在范围内且左右儿子存在
        if (a <= n && v[a] != -1) add(i, a), add(a, i);//无向边
        if (b <= n && v[b] != -1) add(i, b), add(b, i);
    }
    dfs(1);//1号点为根节点
    
    int res = 0;//dist数组存的是根节点1到其他所有点的距离
    for (int i = 1; i <= n; i++) res = max(res, dist[i]);
    cout << res << '\n';
    return 0;
}

标签:遍历,dist,idx,int,层序,ne,二叉树
From: https://www.cnblogs.com/Tshaxz/p/18688564

相关文章

  • 二叉树的遍历(深度遍历)
    二叉树的遍历分为广度遍历和深度遍历。这里我们讲解一下深度遍历的代码如何书写。首先要明确深度遍历有三种遍历次序,分别是:前序遍历(中左右),中序遍历(左中右),后序遍历(左右中)。如何区别这几种遍历方式呢?关键在于单层递归时处理逻辑的位置,比如说先写处理逻辑,再写左递归和右递归......
  • 二叉树的层次遍历(广度优先)
    所谓层次遍历,就是按层次从左往右遍历二叉树。但是一个节点的左子树和右子树之间是没有直接联系方式的。换句话说,当我们遍历了一个节点的左子树的根节点后,无法直接遍历该节点的右子树的根节点。这里我们可以借助一个数据结构,先按一定顺序将节点存放起来,再从该数据结构取出数据,最......
  • 翻转二叉树(力扣226)
    写这道题之前需要熟悉二叉树的遍历,可以看我的这两篇文章:二叉树的遍历(深度遍历)-CSDN博客,二叉树的层次遍历(广度优先)-CSDN博客所谓翻转二叉树,就是将每一个节点的左孩子和右孩子交换(注意这里指的是指针交换,而不是交换节点的数值)。无非就是在遍历二叉树的基础上调用一下swap......
  • 数据结构-二叉树
     树的相关概念:1、节点的度:树中一个节点的孩子个数称为该节点的度,所有节点的度的最大值是树的度2、分支节点:度大于0的节点称为分支节点3、叶子结点:度为0的节点称为叶子结点4、节点的层次(深度):从上往下数,根节点为1层,依次往下加15、树的高度(深度):树中节点的最大层次6、树......
  • 【刷题实录之二叉树】leecode429. N 叉树的层序遍历(层序遍历)
    题目:给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由null值分隔。题解:本体是层序遍历的变形,只需要将“左右孩子入队”变成“所有孩子入队”即可,需对结点数据结构有深入把握。代码(C++):classSolution{public:......
  • web攻击-外部路径遍历攻击(External Path Traversal Attack)
    外部路径遍历攻击(ExternalPathTraversalAttack),也被称为目录遍历攻击,是一种网络攻击技术,攻击者试图通过篡改应用程序或系统的路径参数,访问本来应该受限的文件或目录。 这种攻击通常发生在Web应用程序中,当应用程序处理用户输入的文件路径时,如果没有对路径进行适当的验证和过......
  • 2110 加分二叉树
    描述设一个 n 个节点的二叉树 tree 的中序遍历为 (1,2,3,⋯,n),其中数字 1,2,3,⋯,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di​,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下:记 subtree......
  • 【9.1】树结构-从先序遍历还原二叉树
    一、题目        我们从二叉树的根节点root 开始进行深度优先搜索。        在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为D,则其直接子节点的深度为D+1。根节点的深度为0)。       ......
  • 代码随想录:二叉树的公共祖先
    这道题是真巧妙,巧妙有两点不用区分两个目标节点,只要命中了,就往上代码可以处理一个节点本来就是另一个节点祖先的情况/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode(int......
  • 大一计算机的自学总结:二叉树三种序的非递归遍历
    前言二叉树的递归遍历在我上一篇“二叉树及其三种序的递归遍历”里有。其中用到的“BinaryTree”也在链接文章的“二叉树的创建”里。大一计算机的自学总结:二叉树及其三种序的递归遍历而非递归遍历是借助栈的特性,会更难更复杂。TvT......一、先序遍历#include<bits/stdc++.......