当前位置: 首页 > news >正文

二叉树【2.5】代码专项

目录

醍醐灌顶——node* root 和node* &root作为参数的区别

return value:

 写一个前序遍历的(使用指针)

中序遍历,只改动了preorder,只调换了一行

 后序

层序(使用bfs),新建队列和vector

二叉树的层数

输出所有二叉树节点的层号

翻转二叉树,并且输出反转后的先序&中序序列​编辑

注意,此处向上,难度评级都是:简单!!!!!!!!>-<

还原二叉树


醍醐灌顶——node* root 和node* &root作为参数的区别

插入节点时有引用,而搜索时只有指针没有引用

先中后序遍历亦然,因为只是遍历或者修改节点data,不用引用,

新建节点、改变树的结构需要引用

return value:

3221225477 (0xC0000005): 访问越界,一般是读或写了野指针指向的内存。

3221225725 (0xC00000FD): 堆栈溢出,一般是无穷递归造成的。

 return value 3221225725

3221225620 (0xC0000094): 除0错误,一般发生在整型数据除了0的时候。

我说为何报错说是野指针了,因为没有new申请空间

 写一个前序遍历的(使用指针)

写半天写不对,才发现,自己构造节点可以输出正确的序列(中序亦然)

所以是节点的读入有问题

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;
};
node* tree[N];void preorder(node* root)
{//递归边界:NULL
if(root == NULL)
return;
//遍历
printf("%d ",root->id ); 
preorder(root->lchild);
preorder(root->rchild);}
node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;
//	scanf("%d",&n);node* root=NULL;bool flag=0;
//	for(int i=0;i<n;i++)
//	{
//		int l,r;
//		scanf("%d %d",&l,&r);
//			tree[i]=newnode(i);
//		if(!flag && (l!=-1||r!=-1))
//		{
//			flag=1;
//			root=tree[i];
//			//root->id=i;
//		}
//			if(l!=-1)tree[l]=newnode(l),tree[i]->lchild=tree[l];
//			if(r!=-1)tree[r]=newnode(r),tree[i]->rchild=tree[r];
//	}
//	int i=0;
node* n0=newnode(0);
node* n1=newnode(1);
node* n2=newnode(2);
node* n3=newnode(3);
node* n4=newnode(4);
node* n5=newnode(5);
n0->lchild=n2;n0->rchild=n5;n5->rchild=n3;n2->lchild=n1;n2->rchild=n4;//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;preorder(n0);	
}

 后来我发现了问题,你是边写变创建节点的,可能4一开始被你连上2,但是后来又被你新建new,2-》lchild还是4,但4的孩子在别的地址了,因为new又申请了别的空间

所以我一开始就把n个节点统统创建好?

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;
};
node* tree[N];void preorder(node* root)
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
printf("%d ",root->id ); 
preorder(root->lchild);
preorder(root->rchild);}
node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}
//	int i=0;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=2;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=5;
//	cout<<"node="<<tree[i]->id<<"rchild="<<tree[i]->rchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//cout<<tree[0]->rchild->rchild->id;preorder(root);	
}//node* n0=newnode(0);
//node* n1=newnode(1);
//node* n2=newnode(2);
//node* n3=newnode(3);
//node* n4=newnode(4);
//node* n5=newnode(5);
//n0->lchild=n2;n0->rchild=n5;n5->rchild=n3;n2->lchild=n1;n2->rchild=n4;

 答案对了但格式错误,因为末尾不能有多余的空格

所以新建一个vector存储他们吧

ac了()

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;
};
node* tree[N];
vector<int> ans;
void preorder(node* root)
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
ans.push_back(root->id) ;
preorder(root->lchild);
preorder(root->rchild);}
node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}
//	int i=0;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=2;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=5;
//	cout<<"node="<<tree[i]->id<<"rchild="<<tree[i]->rchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//cout<<tree[0]->rchild->rchild->id;preorder(root);	
for(int i=0;i<ans.size();i++)
{printf("%d",ans[i]);
if(i<ans.size()-1) printf(" ");
}
}//node* n0=newnode(0);
//node* n1=newnode(1);
//node* n2=newnode(2);
//node* n3=newnode(3);
//node* n4=newnode(4);
//node* n5=newnode(5);
//n0->lchild=n2;n0->rchild=n5;n5->rchild=n3;n2->lchild=n1;n2->rchild=n4;

中序遍历,只改动了preorder,只调换了一行

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;
};
node* tree[N];
vector<int> ans;
void preorder(node* root)
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
preorder(root->lchild);
ans.push_back(root->id) ;
preorder(root->rchild);}
node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}preorder(root);	
for(int i=0;i<ans.size();i++)
{printf("%d",ans[i]);
if(i<ans.size()-1) printf(" ");
}
}

 后序

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;
};
node* tree[N];
vector<int> ans;
void preorder(node* root)
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
preorder(root->lchild);preorder(root->rchild);ans.push_back(root->id) ;
}
node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}preorder(root);	
for(int i=0;i<ans.size();i++)
{printf("%d",ans[i]);
if(i<ans.size()-1) printf(" ");
}
}

层序(使用bfs),新建队列和vector

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;
};
node* tree[N];
vector<int> ans;
void preorder(node* root)//前序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
ans.push_back(root->id) ;
preorder(root->lchild);
preorder(root->rchild);}
queue<node*> q;
void layorder(node *root)
{q.push(root);while(!q.empty()){//ans.push_back(->id);node* temp=q.front();ans.push_back(temp->id);q.pop();if(temp->lchild!=NULL) q.push(temp->lchild);if(temp->rchild!=NULL) q.push(temp->rchild);}}
node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}
//	int i=0;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=2;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=5;
//	cout<<"node="<<tree[i]->id<<"rchild="<<tree[i]->rchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//cout<<tree[0]->rchild->rchild->id;layorder(root);	
for(int i=0;i<ans.size();i++)
{printf("%d",ans[i]);
if(i<ans.size()-1) printf(" ");
}
}//node* n0=newnode(0);
//node* n1=newnode(1);
//node* n2=newnode(2);
//node* n3=newnode(3);
//node* n4=newnode(4);
//node* n5=newnode(5);
//n0->lchild=n2;n0->rchild=n5;n5->rchild=n3;n2->lchild=n1;n2->rchild=n4;

二叉树的层数

我:在层序的基础上,添加layer计数,广度遍历完,答案就出来了

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;int lay;
};
node* tree[N];
vector<int> ans;
void preorder(node* root)//前序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
ans.push_back(root->id) ;
preorder(root->lchild);
preorder(root->rchild);}
queue<node*> q;
int ans_layer=1;
void layorder(node *root)
{q.push(root);while(!q.empty()){//ans.push_back(->id);node* temp=q.front();ans.push_back(temp->id);q.pop();if(temp->lchild!=NULL) temp->lchild->lay=temp->lay+1,q.push(temp->lchild), ans_layer=temp->lay+1;if(temp->rchild!=NULL) temp->rchild->lay=temp->lay+1,q.push(temp->rchild), ans_layer=temp->lay+1;}}
node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}
//	int i=0;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=2;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=5;
//	cout<<"node="<<tree[i]->id<<"rchild="<<tree[i]->rchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//cout<<tree[0]->rchild->rchild->id;root->lay =1;	
layorder(root);	
//for(int i=0;i<ans.size();i++)
//{printf("%d",ans[i]);
//if(i<ans.size()-1) printf(" ");
//}
printf("%d",ans_layer);
}//node* n0=newnode(0);
//node* n1=newnode(1);
//node* n2=newnode(2);
//node* n3=newnode(3);
//node* n4=newnode(4);
//node* n5=newnode(5);
//n0->lchild=n2;n0->rchild=n5;n5->rchild=n3;n2->lchild=n1;n2->rchild=n4;

答案:递归求解

height=max(left 子树height,right子树height)+1 

输出所有二叉树节点的层号

因为我刚才已经算出来了,只需输出即可

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;int lay;
};
node* tree[N];
vector<int> ans;
void preorder(node* root)//前序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
ans.push_back(root->id) ;
preorder(root->lchild);
preorder(root->rchild);}
queue<node*> q;
int ans_layer=1;
void layorder(node *root)
{q.push(root);while(!q.empty()){//ans.push_back(->id);node* temp=q.front();ans.push_back(temp->id);q.pop();if(temp->lchild!=NULL) temp->lchild->lay=temp->lay+1,q.push(temp->lchild), ans_layer=temp->lay+1;if(temp->rchild!=NULL) temp->rchild->lay=temp->lay+1,q.push(temp->rchild), ans_layer=temp->lay+1;}}
node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}
//	int i=0;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=2;
//	cout<<"node="<<tree[i]->id<<"lchild="<<tree[i]->lchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//	 i=5;
//	cout<<"node="<<tree[i]->id<<"rchild="<<tree[i]->rchild->id<<"rchild="<<tree[i]->rchild->id<<endl;
//cout<<tree[0]->rchild->rchild->id;root->lay =1;	
layorder(root);	
//for(int i=0;i<ans.size();i++)
//{printf("%d",ans[i]);
//if(i<ans.size()-1) printf(" ");
//}
for(int i=0;i<n-1;i++)
printf("%d ",tree[i]->lay );
printf("%d",tree[n-1]->lay );}//node* n0=newnode(0);
//node* n1=newnode(1);
//node* n2=newnode(2);
//node* n3=newnode(3);
//node* n4=newnode(4);
//node* n5=newnode(5);
//n0->lchild=n2;n0->rchild=n5;n5->rchild=n3;n2->lchild=n1;n2->rchild=n4;

翻转二叉树,并且输出反转后的先序&中序序列

我:翻转函数写了半天,其实就是递归的将所有节点的左孩子与有孩子对调

并且递归顺序与执行顺序无关

void rvs(node* &root)
{if(root==NULL) return;node* tp=new node;tp=root->lchild;root->lchild =root->rchild;root->rchild =tp;rvs(root->lchild);rvs(root->rchild);}

void rvs(node* &root)
{if(root==NULL) return;node* tp=new node;rvs(root->lchild);rvs(root->rchild);tp=root->lchild;root->lchild =root->rchild;root->rchild =tp;}

 都能ac

附完整代码

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;int lay;
};
node* tree[N];
vector<int> ans1,ans2;
void preorder(node* root)//前序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
ans1.push_back(root->id) ;
preorder(root->lchild);
preorder(root->rchild);}
void midorder(node* root)//中序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
midorder(root->lchild);
ans2.push_back(root->id) ;
midorder(root->rchild);}void rvs(node* &root)
{if(root==NULL) return;node* tp=new node;tp=root->lchild;root->lchild =root->rchild;root->rchild =tp;rvs(root->lchild);rvs(root->rchild);}node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}root->lay =1;	
rvs(root);
preorder(root);	
for(int i=0;i<ans1.size();i++)
{printf("%d",ans1[i]);
if(i<ans1.size()-1) printf(" ");
}
printf("\n");
midorder(root);	
for(int i=0;i<ans2.size();i++)
{printf("%d",ans2[i]);
if(i<ans2.size()-1) printf(" ");
}
//for(int i=0;i<n-1;i++)
//printf("%d ",tree[i]->lay );
//printf("%d ",tree[n-1]->lay );}

 答案的思路也是一样,但是用的静态数

并且使用swap进行交换。

试了,指针也可以swap

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N=1005;
struct node
{node* lchild;node* rchild;int data;int id;int lay;
};
node* tree[N];
vector<int> ans1,ans2;
void preorder(node* root)//前序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
ans1.push_back(root->id) ;
preorder(root->lchild);
preorder(root->rchild);}
void midorder(node* root)//中序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
midorder(root->lchild);
ans2.push_back(root->id) ;
midorder(root->rchild);}void rvs(node* &root)
{if(root==NULL) return;node* tp=new node;
swap(root->lchild ,root->rchild );rvs(root->lchild);rvs(root->rchild);}node* newnode(int id1)
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}
int main()
{int n;scanf("%d",&n);node* root=NULL;bool flag=0;for(int i=0;i<n;i++) tree[i]=newnode(i);for(int i=0;i<n;i++){int l,r;scanf("%d %d",&l,&r);//tree[i]=newnode(i);if(!flag && (l!=-1||r!=-1)){flag=1;root=tree[i];//root->id=i;}if(l!=-1)//tree[l]=newnode(l),tree[i]->lchild=tree[l];if(r!=-1)//tree[r]=newnode(r),tree[i]->rchild=tree[r];}root->lay =1;	
rvs(root);
preorder(root);	
for(int i=0;i<ans1.size();i++)
{printf("%d",ans1[i]);
if(i<ans1.size()-1) printf(" ");
}
printf("\n");
midorder(root);	
for(int i=0;i<ans2.size();i++)
{printf("%d",ans2[i]);
if(i<ans2.size()-1) printf(" ");
}
//for(int i=0;i<n-1;i++)
//printf("%d ",tree[i]->lay );
//printf("%d ",tree[n-1]->lay );}

标程

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 50;
struct Node {int l, r;
} nodes[MAXN];
vector<int> pre, in, post;
void preOrder(int root) {if (root == -1) {return;}pre.push_back(root);preOrder(nodes[root].l);preOrder(nodes[root].r);
}
void inOrder(int root) {if (root == -1) {return;}inOrder(nodes[root].l);in.push_back(root);inOrder(nodes[root].r);
}
void revert(int root) {if (root == -1) {return;}revert(nodes[root].l);revert(nodes[root].r);swap(nodes[root].l, nodes[root].r);
}
int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d%d", &nodes[i].l, &nodes[i].r);}revert(0);preOrder(0);inOrder(0);for (int i = 0; i < (int)pre.size(); i++) {printf("%d", pre[i]);if (i < (int)pre.size() - 1) {printf(" ");}}printf("\n");for (int i = 0; i < (int)in.size(); i++) {printf("%d", in[i]);if (i < (int)in.size() - 1) {printf(" ");}}return 0;
}

注意,此处向上,难度评级都是:简单!!!!!!!!>-<

还原二叉树

先序中序=》后序

这玩意必须递归写,

核心就是:给你两个区间,你返回根节点,最后自下而上构成一棵树,最终的返回值是最上面的根节点

#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N=1005;int n;int s1[N],s2[N];
struct node
{node* lchild;node* rchild;int data;int id;int lay;
};
node* tree[N];
vector<int> ans1,ans2,ans3;
void preorder(node* root)//前序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
ans1.push_back(root->id) ;
preorder(root->lchild);
preorder(root->rchild);}
void midorder(node* root)//中序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
midorder(root->lchild);
ans2.push_back(root->id) ;
midorder(root->rchild);}
void nxtorder(node* root)//后序遍历 
{//递归边界:NULL
if(root == NULL)
{//printf("=null");
return;}//遍历
//printf("%d ",root->id ); 
nxtorder(root->lchild);
nxtorder(root->rchild);
ans3.push_back(root->id) ;}
node* newnode(int id1)//新建节点 
{node* Node=new node;Node->id =id1;Node->lchild=NULL;Node->rchild=NULL;return Node;
}node* create(int a1,int b1,int a2,int b2)//前序的左右端点,中序的左右端点,返回值是根节点 
{if(a1>b1 ||a2>b2) return NULL;//注意return NULL,表示自己就是空节点,且不再递归 node* root=newnode(s1[a1]);int k;for(int i=0;i<n;i++){	if(s2[a2+i]==s1[a1]){k=i;break;	}	}root->lchild =create(a1+1,a1+k,a2,a2+k-1);root->rchild =create(a1+k+1,b1,a2+k+1,b2);return root; 
}
int main()
{scanf("%d",&n);node* root=new node;for(int i=0;i<n;i++)	{scanf("%d",&s1[i]);	 } for(int i=0;i<n;i++)	{scanf("%d",&s2[i]);	 } root=create(0,n-1,0,n-1);
//preorder(root);	//输出前序 
//for(int i=0;i<ans1.size();i++)
//{printf("%d",ans1[i]);
//if(i<ans1.size()-1) printf(" ");
//}
//printf("\n");
//midorder(root);	//输出中序
//for(int i=0;i<ans2.size();i++)
//{printf("%d",ans2[i]);
//if(i<ans2.size()-1) printf(" ");
//}
nxtorder(root);	//输出后序
for(int i=0;i<ans3.size();i++)
{printf("%d",ans3[i]);
if(i<ans3.size()-1) printf(" ");
}
//for(int i=0;i<n-1;i++)
//printf("%d ",tree[i]->lay );
//printf("%d ",tree[n-1]->lay );}

解析

 后序中序还原,照搬会堆栈溢出,具体明天再说

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 合宙LuatOS开发板使用说明——Air700ECQ
  • Jenkins:自动化的魔法师,打造无缝CI/CD流水线
  • 企业级WEB应用服务器TOMCAT——超详细攻略
  • spring揭秘10-aop04-基于AspectJ类库注解织入横切逻辑
  • 中科服务器磁盘未断电状态被人拔插导致raid故障,安装系统找不到系统盘 修复raid再次安装系统成功
  • 【第78课】数据库安全RedisCouchDBH2database未授权访问CVE漏洞
  • [数据集][目标检测]红外场景下车辆和行人检测数据集VOC+YOLO格式19069张4类别
  • go gc信息如何查看
  • Linux 离线安装docker和docker-compose
  • 21.2 Netty聊天会话管理
  • VScode常见问题的解决方法
  • 简单实现进度条效果(vue2)
  • Windows SDK(九)登录框和计算器练习
  • 数码管进阶设计验证
  • 3.3-CoroutineScope/CoroutineContext:从挂起函数里获取 CoroutineContext
  • 时间复杂度分析经典问题——最大子序列和
  • 【5+】跨webview多页面 触发事件(二)
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CSS魔法堂:Absolute Positioning就这个样
  • IndexedDB
  • leetcode-27. Remove Element
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • nodejs实现webservice问题总结
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React组件设计模式(一)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • WePY 在小程序性能调优上做出的探究
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 番外篇1:在Windows环境下安装JDK
  • 经典排序算法及其 Java 实现
  • 前端面试总结(at, md)
  • 延迟脚本的方式
  • 智能合约开发环境搭建及Hello World合约
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​flutter 代码混淆
  • ​学习一下,什么是预包装食品?​
  • #07【面试问题整理】嵌入式软件工程师
  • #单片机(TB6600驱动42步进电机)
  • (06)Hive——正则表达式
  • (35)远程识别(又称无人机识别)(二)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (五)MySQL的备份及恢复
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)重识new
  • ... 是什么 ?... 有什么用处?
  • ./configure、make、make install 命令
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET CORE Aws S3 使用
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @RequestParam,@RequestBody和@PathVariable 区别