PAT甲级1119,1086,1020总结
2017-10-28 14:38
746 查看
1086已知中序先序求后序
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已知先序后序求中序
#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; }
相关文章推荐
- PAT(甲级)1020
- PAT 1020(由二叉树的中序和后序,求层序遍历) 1086(由二叉树的中序和先序求后序遍历)
- PAT - 甲级 - 1020. Tree Traversals (25)(层次遍历)
- PAT甲级 1020
- PAT 甲级 1020. Tree Traversals
- **浙大PAT甲级 1086 二叉树的先中根遍历求后根遍历
- PAT甲级 1020. Tree Traversals (25)
- PAT甲级1020
- 1086. Tree Traversals Again (25)-PAT甲级真题
- PAT(甲级)1086
- [PAT-甲级]1020.Tree Traversals
- PAT甲级真题及训练集(19)--1020. Tree Traversals (25)(后序,中序建树,很重要)
- PAT—甲级-1086
- PAT 甲级 1020 Tree Traversals (二叉树遍历)
- PAT程序设计考题——甲级1020( Tree traverse ) C++实现
- PAT 甲级 1020 Tree Traversals (二叉树遍历)
- [置顶] [PAT-甲级]索引以及知识点总结
- pat 甲级 1020
- PAT甲级1086
- 【PAT甲级】1020. Tree Traversals (25)