浪漫侧影(c/c++完整代码)

由于做到了这题(7-9 浪漫侧影(仿2021 520钻石争霸赛7-8—浙江大学 陈越),在网上又没找到什么代码,那我就补充一下,因为找到的那个C++的代码在PTA上也没全部通过
做这道题要对层序遍历比较了解才能看懂我在主函数的那块核心代码,所以不太明白的话就去看层序遍历吧,哦,那块我会讲一下的
题目要求:
“侧影”就是从左侧或者右侧去观察物体所看到的内容。例如上图中男生的侧影是从他右侧看过去的样子,叫“右视图”;女生的侧影是从她左侧看过去的样子,叫“左视图”。 520 这个日子还在打比赛的你,也就抱着一棵二叉树左看看右看看了…… 我们将二叉树的“侧影”定义为从一侧能看到的所有结点从上到下形成的序列。例如下图这棵二叉树,其右视图就是 { 1, 2, 3, 4, 5 },左视图就是 { 1, 6, 7, 8, 5 }。

于是让我们首先通过一棵二叉树的中序遍历序列和后序遍历序列构建出一棵树,然后你要输出这棵树的左视图和右视图。

输入格式:

输入第一行给出一个正整数 N (≤20),为树中的结点个数。随后在两行中先后给出树的中序遍历和后序遍历序列。树中所有键值都不相同,其数值大小无关紧要,都不超过 int 的范围。

输出格式:

第一行输出右视图,第二行输出左视图,格式如样例所示。

输入样例:

在这里给出一组输入。例如:

8
6 8 7 4 5 1 3 2
8 5 4 7 6 3 2 1

输出样例:

在这里给出相应的输出。例如:
首先看一下c++

R: 1 2 3 4 5
L: 1 6 7 8 5


#include<bits/stdc++.h>		    //建立一棵二叉树                           
using namespace std;
 
int N,in[2000],back[2000];            //N 中序 后序
int flag=1;                           //判断有问题                                      
int height=-1;	                      //深度
 
 
typedef struct BitNode{		        //二叉链表结点结构 
	int data;		        //结点数据 
	struct BitNode *lchild,*rchild;		    //左右孩子指针 
}BitNode,* BitTree;		        //并列改名,定义结点用BitNode,定义结点指针用BitTree 
 
 
BitTree CreateTree(int inl,int inr,int backl,int backr)	    //建立二叉树函数 
{
	if(inl==inr)	                //只有一个元素 
	{
		if(back[backl]!=in[inl])
		{
			flag=0;            //判断错误
			return NULL;
		}
	}
       
 
	if(backl>backr)	return NULL;        
	BitTree a = new BitNode;        //分配空间(C++用的是new)
	a->data = back[backr];
	
	int m;
	for(int i=inl;i<=inr;i++)	//找根的位置下标 
	{
		if(in[i]==back[backr])
		{
			m = i;
			break;
		}
	}							
								//m是中序中的位置,用于后序要慎重! 
	a->lchild = CreateTree(inl,m-1,backl,backl+m-inl-1);	//最后位置不能写back+m-1,应该相对backl控制数量 
	a->rchild = CreateTree(m+1,inr,backl+m-inl,backr-1);    //这里写不好就会一直递归,段错误 
	return a;
}
void get_height(BitTree a,int ceng)        //求深度函数
{
	if(a==NULL)	
	{
		if(ceng>height)	height = ceng;                                
		return;
	}
	get_height(a->lchild,ceng+1);
	get_height(a->rchild,ceng+1);
	ceng++;
}
 
queue<BitTree>q;		//结构指针队列 
vector<int>vec;			//开个不定长数组                               

int main()
{
	cin>>N;
	for(int i=0;i<=N-1;i++)
		cin>>in[i];
	for(int i=0;i<=N-1;i++)
		cin>>back[i];
	
	BitTree root = CreateTree(0,N-1,0,N-1);	                        
	get_height(root,0);
	
        BitTree a[height][10000];      //定义一个结构指针类型的数组,用于储存每一层树的节点,就是个节点的集合体,和根结点的定义没什么区别
        a[0][0]=root;             //第一层第一个就是根节点
        
	for(int i=1;i<height;i++)    //核心代码,运用层序遍历思想
	{
                int k=0;
		for(int j=0;a[i-1][j]!=NULL;j++){    //从第二层开始遍历,若上层第一个不为空就遍历到同层的第二个,目的是为了把这层的结点都赋到对应层数数组里
                    if(a[i-1][j]->lchild!=NULL){a[i][k]=a[i-1][j]->lchild;k++;}     //j只是遍历用
                    if(a[i-1][j]->rchild!=NULL){a[i][k]=a[i-1][j]->rchild;k++;}
                }
	}
        cout<<"R: ";
        for(int i=0;i<height;i++){
            int j=0;
            for(j=0;a[i][j]!=NULL;j++);
            if(i!=0) cout<<" ";      //如果PTA格式错误大概就是空格问题,很好解决的
            cout<<a[i][j-1]->data;
        }
        cout<<endl<<"L: ";
        for(int i=0;i<height;i++){
            if(i!=0) cout<<" ";
            cout<<a[i][0]->data;
        }
	return 0;
}

然后看看c的代码(和上面其实没区别的)

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
#define MaxSize 100
int post[100]; 
int in[100];
int n,height=-1;	  
//typedef struct BTNode* BiTree;
typedef struct node BTNode;
typedef struct node
{
	ElemType data;
	BTNode *lchild;
	BTNode *rchild;
}BTNode,*BiTree;

BTNode *CreateBT2(int *post,int *in,int n)
{
	BTNode *b;
	int r,*p;
	int k;
	if(n<=0) return NULL;
	r=*(post+n-1);
	b=(BTNode*)malloc(sizeof(BTNode));
	b->data=r;
	for(p=in;p<in+n;p++){
		if(*p==r)break;
	}
	k=p-in;
	b->lchild=CreateBT2(post,in,k);
	b->rchild=CreateBT2(post+k,p+1,n-k-1);
	return b;
}
void get_height(BTNode *a,int ceng)        //求深度函数
{
	if(a==NULL)	
	{
		if(ceng>height)	height = ceng;
		return;
	}
	get_height(a->lchild,ceng+1);
	get_height(a->rchild,ceng+1);
	ceng++;
}
int main()
{
	BTNode *t = (BTNode *)malloc(sizeof(BTNode));
	int post[100], in[100];
//	printf("请输入接点数:");
	scanf("%d",&n);
//	printf("请输入中序遍历结果:");
	for(int i=0;i<n;i++)
	scanf("%d",&in[i]);
//	printf("请输入后序遍历结果:");
	for(int i=0;i<n;i++)
	scanf("%d",&post[i]);
	t = CreateBT2(post,in,n);
	get_height(t,0);
    BTNode *a[height][10000];
    a[0][0]=t;  
	for(int i=1;i<height;i++)
	{
        int k=0;
		for(int j=0;a[i-1][j]!=NULL;j++){
            if(a[i-1][j]->lchild!=NULL){a[i][k]=a[i-1][j]->lchild;k++;}
            if(a[i-1][j]->rchild!=NULL){a[i][k]=a[i-1][j]->rchild;k++;}
        }
	}
	printf("R:");
	for(int i=0;i<height;i++){
        int j=0;
        for(j=0;a[i][j]!=NULL;j++);
        printf(" %d",a[i][j-1]->data);
        }
        printf("\n");
        printf("L:");
        for(int i=0;i<height;i++){
            printf(" %d",a[i][0]->data);
        }
	return 0;
}

咳咳,(这是给萌新说的,大佬可以略过……。不要觉得难,其实它就是很难,废了好大劲的,主要是我也不太会结构体什么的,层序遍历写了好几遍,构建二叉树也弄了好几遍,还要解决c没有引用这个问题,呜呜呜呜………………)

最后,我本来还要弄好久,思路是知道,但怎么把它存到数组是真的好难想,我室友不吭不响一会就把我想好久还要想好久的问题给解决了,让我有种想哭的冲动,不说了。

没错,那串核心代码就是他想的

吾有室友,是为!

posted @ 2021-12-14 21:33  大睡小楼  阅读(787)  评论(0编辑  收藏  举报