pat A1043
题意:
解题思路:
参考代码:
//还是按照结构类型
/*
1.要有插入函数:注意是node类型 指针引用 3个if条件
2.4个操作函数:注意第2个形参为vector<int> &vi引用的类型,因为要对里面进行赋值
3.最后判断:
1.如果origin==pre则,输出yes,输出vector后序数组
2.如果origin==preM,则输出,镜像后序
4.否则,输出no
5.对于插入函数,数字小插入左边,数字大插入右边,
*/
#include<iostream>
#include<vector>
using namespace std;
const int maxn=1001;
vector<int> pre,preMirr,post,postMirr,origin;
struct node
{
int data;
node *lchild;
node *rchild;
};
int n;
void insert(node *&root, int x)
{
if(root==NULL)
{
root=new node; //如果是node *root=new node表示新定义一个root地址,如果是root=new node则表示在原有root指向的地址开辟一个新的空间
root->data=x;
root->lchild=root->rchild=NULL;
return ;
}
if(root->data<=x)
insert(root->rchild,x);
else
insert(root->lchild,x);
}
void preorder(node *root, vector<int> &vi)
{
if(root==NULL)
return ;
vi.push_back(root->data);
preorder(root->lchild,vi);
preorder(root->rchild,vi);
}
void preMirrorder(node *root,vector<int> &vi)
{
if(root==NULL)
return ;
vi.push_back(root->data);
preMirrorder(root->rchild,vi);
preMirrorder(root->lchild,vi);
}
void postorder(node *root, vector<int> &vi)
{
if(root==NULL)
return ;
postorder(root->lchild,vi);
postorder(root->rchild,vi);
vi.push_back(root->data);
}
void postMirrorder(node *root, vector<int> &vi)
{
if(root==NULL)
return ;
postMirrorder(root->rchild,vi);
postMirrorder(root->lchild,vi);
vi.push_back(root->data);
}
int main()
{
cin >> n;
int temp;
node *root=NULL;
for(int i=0; i<n; i++)
{
cin >> temp;
origin.push_back(temp);
insert(root,temp);
}
preorder(root,pre);
preMirrorder(root,preMirr);
postorder(root,post);
postMirrorder(root,postMirr);
if(pre==origin)
{
cout << "YES" << endl;
for(int i=0; i<post.size(); i++)
{
if(i!=0)
cout << " ";
cout << post[i];
}
}
else if(origin==preMirr)
{
cout << "YES" << endl;
for(int i=0; i<postMirr.size(); i++)
{
if(i!=0)
cout << " ";
cout << postMirr[i];
}
}
else
cout << "NO" << endl;
return 0;
}
注意点:
二叉树的插入:从根结点开始,小的往左边放,大的往右边放,每次都是从根结点开始遍历
A1064:
/*
将二叉排序树<---->完全二叉排序树:
1.将输入的数组按照增序排列
2.然后按照中序的遍历的方式再输入到树中
3.其实对于根结点从1开始而言的二叉树而言,其左孩子的下标为2*i,右孩子的下标为2*i+1
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1001;
int n,origin[maxn],com[maxn],k=0;
void insert1(int root)
{
if(root>n)
return ;
insert1(2*root);
com[root]=origin[k++];
insert1(2*root+1);
}
int main()
{
cin >> n;
for(int i=0; i<n; i++)
cin >> origin[i];
sort(origin,origin+n);
insert1(1);
for(int i=1; i<=n; i++)
{
if(i!=1)
cout << " ";
cout << com[i];
}
return 0;
}
A1099
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
/*
本题思路:
1.二叉排序树其实就是按照一组数列的升序--->按中序遍历到树中
2.这道题相比于上一题,他的思路不是按照左子树为2*i,右子树为2*i+1的方式,而是按照数组结构中的左右子树来进行存放
*/
const int maxn=101;
struct node
{
int data;
int lchild;
int rchild;
}Node[maxn];
int n,shuzu[maxn],num=0,kk=0;
void fuckb(int index)
{
if(index==-1)
return ;
fuckb(Node[index].lchild);
Node[index].data=shuzu[num++];
fuckb(Node[index].rchild);
}
void layer(int root)
{
queue<int> Q;
Q.push(root);
while(!Q.empty())
{
int top=Q.front();
Q.pop();
cout << Node[top].data;
kk++;
if(kk<n)
cout << " ";
if(Node[top].lchild!=-1)
Q.push(Node[top].lchild);
if(Node[top].rchild!=-1)
Q.push(Node[top].rchild);
}
}
int main()
{
cin >> n;
int temp1,temp2;
for(int i=0; i<n; i++)
{
cin >> temp1 >> temp2;
Node[i].lchild=temp1;
Node[i].rchild=temp2;
}
for(int i=0; i<n; i++)
cin >> shuzu[i];
sort(shuzu,shuzu+n);
fuckb(0);
layer(0);
return 0;
}