您的位置:首页 > 其它

PAT甲级1119,1086,1020总结

2017-10-28 14:38 746 查看
1086已知中序先序求后序

#include<iostream>
#include<queue>
#include<stack>
#include<string>
#include<string.h>
#include<cstring>
using namespace std;

int pre[30];
int ino[30];
int flag = 1;

struct TreeNode
{
int data;
TreeNode* lefttree;
TreeNode* righttree;
};

TreeNode *createTree(int pl, int pr, int il, int ir)
{
if (pl > pr) return NULL;
int i = 0;
for (i = il; ino[i] != pre[pl]; i++);
TreeNode *tree = (TreeNode*)malloc(sizeof(TreeNode));
tree->data = pre[pl];
tree->lefttree = createTree(pl + 1, pl + i - il, il, i - 1);
tree->righttree = createTree(pl + i - il + 1, pr, i + 1, ir);
if (flag == 1)
{
printf("%d", tree->data);
flag = 2;
}
else
{
printf(" %d", tree->data);
}
return tree;
}
int main()
{
int n, i = 0, j = 0;;
stack<int> s;
char str[4];
scanf("%d", &n);
scanf("%s %d", &str, &pre[i]);
s.push(pre[0]);
i++;
while (j < n)
{
scanf("%s", &str);
if (string(str) == "Push")
{
scanf("%d", &pre[i]);
s.push(pre[i]);
i++;
}
else if (string(str) == "Pop")
{
ino[j] = s.top();
s.pop();
j++;
}
}
TreeNode *root = createTree(0, n - 1, 0, n - 1);
return 0;
}


1020已知中序后序求先序

#include<iostream>
#include<queue>
using namespace std;

int pos[30];
int ino[30];

struct TreeNode
{
int data;
TreeNode* lefttree;
TreeNode* righttree;
};

TreeNode *createTree(int pl,int pr,int il,int ir)
{
if (pl > pr) return NULL;
TreeNode* tree;
int i = 0;
for (i = il; i < ir, pos[pr] != ino[i]; i++);
tree = (TreeNode*)malloc(sizeof(TreeNode));
tree->data = pos[pr];
tree->lefttree = createTree(pl, pl + i - 1 - il, il, i - 1);
tree->righttree = createTree(pl + i - il, pr - 1, i + 1, ir);
return tree;
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &pos[i]);
}
for (int i = 0; i < n; i++)
{
scanf("%d", &ino[i]);
}
TreeNode *root=createTree(0,n-1,0,n-1);
queue<TreeNode*> que;
que.push(root);
printf("%d", root->data);
int j = 0;
while (!que.empty())
{
TreeNode *t = que.front();
if (j != 0 && t != NULL)
{
printf(" %d", t->data);
}
j = 2;
que.pop();
if (t->lefttree != NULL)
{
que.push(t->lefttree);
}
if (t->righttree != NULL)
{
que.push(t->righttree);
}
}
return 0;
}

1119已知先序后序求中序

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"

#include<iostream>
#include<queue>
#include<stack>
#include<string>
#include<string.h>
#include<cstring>
#include<vector>
using namespace std;

int pre[30];
int pos[30];
int ino[30];
int k = 0;

int CreateTree(int l1,int r1,int l2,int r2)
{
if (l1 > r1) return 0;//如果没有某一子节点,则中序遍历不唯一
if (l1 == r1)//如果没有任意子节点,则在这里截胡,直接存入数组返回1
{
ino[k++] = pre[l1];
return 1;
}
int i = 0;
for ( i = l2; pre[l1+1] != pos[i]; i++);//找到自己子节点中的根节点
int ok = 1;
ok &= CreateTree(l1 + 1, l1 + 1 + i - l2, l2, i);//在后序中,找到的该根节点及其之前的节点为当前结点的左孩子
ino[k++]=pre[l1];//中序遍历嘛,这里存入数据
ok &= CreateTree(l1 + 2 + i - l2, r1, i + 1, r2 - 1);//在后序中,找到的该根节点之后的节点,不包括该根节点,为当前节点的右孩子(l1+2+i-l2是左边界,该边界由i定义,而右边界为r1,与i无关,所以前面return0的判断条件那么写,就是我不管你有没有左右节点,我都往下传,判断没有则返回0)
return ok;
}

int main()
{

while (1)
{
int n;
scanf("%d", &n);
for (int i = 1; i <=n; i++)
{
scanf("%d", &pre[i]);
}
for (int i = 1; i <= n; i++)
{
scanf("%d", &pos[i]);
}
int ok=CreateTree(1, n, 1, n);
ok ? printf("Yes") : printf("No");
printf("\n");
for (int i = 0; i < k; i++)
{
if (i==0)
{
printf("%d", ino[i]);
}
else
{
printf(" %d", ino[i]);
}
}
}
return 0;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: