首页 > 其他分享 >如何建立一颗二叉树?(数据结构:树 + hash表 / 广搜BFS)

如何建立一颗二叉树?(数据结构:树 + hash表 / 广搜BFS)

时间:2024-07-20 21:28:53浏览次数:14  
标签:遍历 hash bck int mid BFS 二叉树 端点 root

一个二叉树,树中每个节点的权值互不相同。

现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。

输入格式

第一行包含整数 N,表示二叉树的节点数。

第二行包含 N 个整数,表示二叉树的后序遍历。

第三行包含 N 个整数,表示二叉树的中序遍历。

输出格式

输出一行 N 个整数,表示二叉树的层序遍历。

数据范围

1≤N≤30
官方并未给出各节点权值的取值范围,为方便起见,在本网站范围取为 1∼N。

输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例: 
4 1 6 3 5 7 2

以这个问题为例,这道题的思路很明显就是先建立这个二叉树,如何广搜搜一遍就是层次遍历

那如何建树呢?

其实只要给出任意两种遍历方式就能建树,这里我们以这个题为例,请往下看:

前序:根左右,中序:左根右,后序:左右根(这个一定要牢记)

从后序的根节点入手,去定位到中序的根,然后进入左子树(如果存在),在进入右子树,不断的递归,每一次都用hash表记录根的左右节点的值,建立这颗树,当然在下面的代码部分我会解释一些技巧,然后bfs去一层一层遍历树就行了

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 35;
int bck[N],mid[N];
unordered_map<int,int> l,r,m;

int n;

int build(int mid_l,int mid_r,int bck_l,int bck_r){
    int root = bck[bck_r];
    int index = m[root];
    if(mid_l < index) l[root] = build(mid_l,index - 1,bck_l,bck_l + index - mid_l - 1);
    if(mid_r > index) r[root] = build(index + 1,mid_r,bck_r + index - mid_r,bck_r - 1);
    return root;
}

void bfs(int root){
    queue<int> q;
    q.push(root);
    while(!q.empty()){
        auto ans = q.front();
        cout << ans << " ";
        q.pop();
        if(l[ans]) q.push(l[ans]);
        if(r[ans]) q.push(r[ans]);
    }
}

int main()
{
    cin >> n;
    for(int i=0;i<n;i++) cin >> bck[i];
    for(int i=0;i<n;i++){
        cin >> mid[i];
        m[mid[i]] = i;
    }
    int root = build(0,n-1,0,n-1);
    bfs(root);
    return 0;
}

这里是最难想的部分,一步一步来,如果左子树存在,那么找中序中左子树的左右端点,这个没有难度,但后序的左右端点就需要技巧了,首先左端点就是后序的左端点,右端点请看:

解方程式:设右端点是x,那么x - bck_l = index - 1 - mid_l,是不是有点懵这个地方为什么相等?

因为每次递归中序的右端点 - 左端点 == 后序的右端点 - 左端点,无论是左子树还是右子树

然后每次都根节点指向的都存到hash表里面

之后就是经典的bfs了,如果不懂bfs可以看看洛谷P1443 马的遍历(bfs广搜的基本应用)-CSDN博客

这道题还是比较经典的,希望还是花时间啃一啃

加油

标签:遍历,hash,bck,int,mid,BFS,二叉树,端点,root
From: https://blog.csdn.net/AuRoRamth/article/details/140577500

相关文章

  • 【C++BFS 回溯】756. 金字塔转换矩阵
    本文涉及知识点C++BFS算法C++回溯LeetCode756.金字塔转换矩阵你正在把积木堆成金字塔。每个块都有一个颜色,用一个字母表示。每一行的块比它下面的行少一个块,并且居中。为了使金字塔美观,只有特定的三角形图案是允许的。一个三角形的图案由两个块和叠在上面的单......
  • 【数据结构】二叉树———Lesson2
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • 数据结构(二叉树-1)
    文章目录一、树1.1树的概念与结构1.2树的相关术语1.3树的表示二、二叉树2.1二叉树的概念与结构2.2特殊的二叉树满二叉树完全二叉树2.3二叉树的存储结构三、实现顺序结构二叉树3.1堆的概念与结构3.2堆......
  • 数据结构 - HashSet
    概述java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出......
  • 【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计
    初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索底层逻辑......
  • 【数据结构】超详解二叉树
    1、树的概念及结构堆与树的结构类似堆的概念及代码实现-CSDN博客树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根结点没有前驱结点除......
  • 二叉树的种类
    二叉树:二叉树是每个节点最多有两个子树的树结构。完全二叉树:除最后一层外,每一层上的节点数量均达到了最大值,在最后一层上只缺少右边的若干节点。满二叉树:除最后一层无任何子节点外,每一层上的所有节点都有两个子节点的二叉树。二叉搜索树(二叉排序树、二叉查找树):左子树<根节点<右......
  • 「代码随想录算法训练营」第十六天 | 二叉树 part6
    530.二叉搜索树的最小绝对差题目链接:https://leetcode.cn/problems/minimum-absolute-difference-in-bst/题目难度:简单文章讲解:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html视频讲解:https://www.bilibili.com/video/BV1DD4y11779题目状态:通过思路:将二......
  • 对JAVA的HashMap的深入理解
    今天我们来从源码层面分析JAVA的HashMap底层实现原理,我们还是先从HashMap的构造方法来分析。我们发现HashMap有四个构造方法,首先还是来分析它的无参构造方法,源码如下:这个方法比较简单定义了一个数据成员loadFactor的值,设置为0.75。我们再来看第二个方法HashMap(int)发......
  • Day 17 二叉树part05
    654.最大二叉树这道题和昨天的根据中序后序遍历构造二叉树比较相似。借鉴那个思路去做就差不多。classSolution{publicTreeNodeconstructMaximumBinaryTree(int[]nums){returnconstruct(nums,0,nums.length);}publicTreeNodeconstruct(int......