问题 D: 上帝视角

时间限制: 1 Sec内存限制: 128 MB提交: 558解决: 139
提交状态
题目描述
给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列,并给出从右往左、从右上往左下、从上往下分别能看到的结点个数。注意,此处均把二叉树的每条边都设置为等长,角度为45度,因此结点可能在视觉上重叠。所谓从右往左看是指,对同一层的结点,右边的结点会挡住左边的结点,这样同一层结点就只能看到最右边的那一个;同样的,从右上往左下看是指,右上角的结点会挡住左下角45度的结点;从上往下看是指,对同一竖直位置来说,只能看到最上方的结点。

例如对下图来说,从右往左能看到3个结点,从右上往左下能看到3个结点,从上往下能看到5个结点

这里写图片描述

输入
每个输入文件中一组数据。

第一行一个正整数N1<=N<=30),代表二叉树的结点个数(结点编号为1~N)。

接下来两行,每行N个正整数,分别代表二叉树的层序遍历序列和中序遍历序列。数据保证序列中1~N的每个数出现且只出现一次。

输出
先输出两行,每行N个正整数,分别代表二叉树的先序遍历序列和后序遍历序列。

接下来分三行输出从右往左、从右上往左下、从上往下分别能看到的结点个数。

每行末尾均不允许输出多余的空格。

样例输入
7
1 2 3 4 5 6 7
4 2 5 1 6 3 7
样例输出
1 2 4 5 3 6 7
4 5 2 6 7 3 1
3
3
5
提示
提交状态

这道题提交了整整9次,最后发现是题目看错,题目要求的是从右上往左下看,而我在求从右下往左上看
首先递归,构建树,这个找找规律就好,之后先序后序输出,直接递归输出即可
最后看到的节点个数
1.从右往做看,这个即求树的层数,只要构建树的时候加个小变量代表当前层数即可
2.从右上往左下看,这个即求往右的最大深度,即只有往右的时候,看到的个数才会+1,同样设置个小变量即可
3.从上往下看,这个可以看成树的宽度,设根节点为位置0,往左就是位置-1,往右就是位置+1,构建一遍树下来可以求出最小位置l和最大位置r

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct node {
    int data;
    node *l, *r;
    int tt;
    node() { l = r = NULL; }
};
vector<int> a, b;int N;
vector<node> all;
int lev = 0, lev2 = 0, lev3 = 0;//依次代表看到的个数
int l = 0, r = 0;//代表最左位置和最右位置
void change(vector<int> a, int b1, int b2, int v, int m, int n)//v代表层数,m代表往右的层数,n代表位置
{//构建树
    if (m > lev2) lev2 = m;
    if (n > r) r = n;
    if (n<l) l = n;
    if (++v > lev) lev = v;
    int pos = find(b.begin(), b.end(), a[0]) - b.begin();
    int k = 1;
    if (pos > b1)
    {
        vector<int> temp;
        all[a[0]].l = &all[a[k++]];
        vector<bool> visited(N + 1, false);
        for (int t = b1;t < pos;t++)
            visited[b[t]] = true;
        for (auto x : a)
            if (visited[x]) temp.push_back(x);
        change(temp, b1, pos - 1, v, m, n - 1);
    }
    if (pos < b2)
    {
        vector<int> temp;
        all[a[0]].r = &all[a[k]];
        vector<bool> visited(N + 1, false);
        for (int t = pos + 1;t <= b2;t++)
            visited[b[t]] = true;
        for (auto x : a)
            if (visited[x]) temp.push_back(x);
        change(temp, pos + 1, b2, v, m + 1, n + 1);
    }
}
int cnt;
void PreOrderTraver(node *root)//先序遍历
{
    if (root == NULL) return;
    if (cnt++)   cout << " " << root->data;
    else cout << root->data;
    PreOrderTraver(root->l);
    PreOrderTraver(root->r);
}
void PostOrderTraver(node *root)//后序遍历
{
    if (root == NULL) return;

    PostOrderTraver(root->l);
    PostOrderTraver(root->r);
    if (cnt++)  cout << " " << root->data;
    else cout << root->data;
}

int main()
{
    cin >> N;
    a.resize(N);b.resize(N);all.resize(N + 1);
    for (int t = 1;t <= N;t++)
        all[t].data = t;
    for (int t = 0;t < N;t++)
        cin >>a[t];
    for (int t = 0;t < N;t++)
        cin >> b[t];
    change(a, 0, N - 1, 0, 1, 0);
    node *root;
    root = &all[a[0]];
    cnt = 0;
    PreOrderTraver(root);
    cout << endl;
    cnt = 0;
    PostOrderTraver(root);
    cout << endl;
    lev3 = r - l + 1;
    cout << lev << endl << lev2 << endl << lev3 << endl;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、下4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、下4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值