首页 > 其他分享 >1102 反转二叉树

1102 反转二叉树

时间:2023-04-21 20:22:52浏览次数:48  
标签:结点 int 反转 1102 二叉树 push include

以下是来自 Max Howell @twitter 的内容:

谷歌:我们的百分之九十的工程师都使用你编写的软件,但是你连在白板上反转二叉树都做不到,还是滚吧。

现在,请你证明你会反转二叉树。

输入格式

第一行包含一个整数 N,表示树的结点数量。

所有结点编号从 0 到 N−1。

接下来 N 行,每行对应一个 0∼N−1 的结点,给出该结点的左右子结点的编号,如果该结点的某个子结点不存在,则用  表示。

输出格式

输出反转后二叉树的层序遍历序列和中序遍历序列,每个序列占一行。

相邻数字之间用空格隔开,末尾不得有多余空格。

数据范围

1≤N≤10

输入样例:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

输出样例:

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

代码实现:

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int N=20;
vector<int>level,middle;
int l[N],r[N],vis[N];
void dfs(int x){
    if(r[x]!=-1)dfs(r[x]);
    middle.push_back(x);
    if(l[x]!=-1)dfs(l[x]);
}
void bfs(int x){
    queue<int>q;
    q.push(x);
    while(q.size()){
        int t=q.front();
        q.pop();
        level.push_back(t);
        if(r[t]!=-1)q.push(r[t]);
        if(l[t]!=-1)q.push(l[t]);
    }
}
int main(){
    int n;
    cin>>n;
    memset(l,-1,sizeof l);
    memset(r,-1,sizeof r);
    for(int i=0;i<n;i++){
        char x,y;
        cin>>x>>y;
        if(x!='-')l[i]=(x-'0'),vis[x-'0']=1;
        if(y!='-')r[i]=(y-'0'),vis[y-'0']=1;
    }
    int root=-1;
    for(int i=0;i<n;i++){
        if(!vis[i]){
            root=i;
            break;
        }
    }
    dfs(root);
    bfs(root);
    for(int i=0;i<level.size();i++){
        if(i==0)cout<<level[i];
        else cout<<" "<<level[i];
    }
    cout<<endl;
    for(int i=0;i<middle.size();i++){
        if(i==0)cout<<middle[i];
        else cout<<" "<<middle[i];
    }
    return 0;
}

 

标签:结点,int,反转,1102,二叉树,push,include
From: https://www.cnblogs.com/hxss/p/17341695.html

相关文章

  • 数据结构 ---> 二叉树 -->堆之解析_01
    老友们好!本期将对堆之构建进行解说!相信,初学此章节的老友!!或多或少,对前一期的部分代码,有所困惑!说真的,堆的有些内容理解起来还是挺困难的!好了,废话不多讲!开始本期的解析之旅吧!希望大家都能有所收获!!下面,先看一组,上一期的图示:>那么该如何操作,才能取得前几名的数值呢?针对这点,部分老友......
  • js 实现字符串反转
    1.情景展示在JavaScript当中,如何实现字符串倒转(倒置、反转)?2.具体分析数组Array实现元素倒转,有专门的函数reserve(),我们直接调用即可。为了使用这个功能,我们可以把字符串先拆分成数组,然后,再调用反转函数,最后再拼成字符串。3.解决方案以字符串:Marydon的博客园为例进行说明。......
  • SDUTOJ 2128 树结构练习——排序二叉树的中序遍历
    树结构练习——排序二叉树的中序遍历TimeLimit:1000MSMemorylimit:65536K题目描述在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值(2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值(3).任意一个节......
  • 全二叉树
    全二叉树(CompleteBinaryTree)是一种特殊的二叉树,它的所有叶子节点都在同一层上,而且除了最后一层之外,其它层的节点数都达到了最大值,最后一层的节点从左到右依次排列。具有n个节点的完全二叉树,其节点编号从1到n,按照从上到下、从左到右的顺序进行编号,则有以下性质:如果一个节点的......
  • 浅谈全局平衡二叉树
    首先,这个是GBT,不是GPT。其次,那个是ChatGPT,不是ChatGBT。原理我们先考虑一个经典的问题:单点修树上最大权独立集问题,也就是LuoguP4719【模板】"动态DP"&动态树分治。使用树剖维护矩阵可以做到\(O(n\log^2n)\)的复杂度,可以通过\(10^5\)的数据。那我们能不能把这个问题优化......
  • LeetCode Top100: 反转链表 (python)
     给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[] 提示:链表中节点的数目范围是 [0,5000]-5000<=Node.val<=5000实现:给你......
  • LeetCode Top100: 翻转二叉树(python)
    给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[] 提示:树中节点数目范围在 [0,100] 内-100<=Node.val<=100实......
  • LeetCode Top 100: 二叉树的直径 (python)
     给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例:给定二叉树1/\23/\45返回 3,它的长度是路径[4,2,1,3]......
  • 4月18日leetcode二叉树几种遍历方式的非递归和递归
    给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例1:二叉树的前序中序和后序遍历算法是学习二叉树必不可少的,若是使用c语言遍历前中后序还是比较繁琐的,因为要考虑遍历结果存放的序列大小问题,想要解决这个问题就得想用递归计算二叉树的节点数量,再调用递归子函数完......
  • leetcode-206反转链表
    反转链表方法一:迭代法/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,ListNode*next)......