PAT甲级1119,1086,1020总结

来源:互联网 发布:淘宝卖家怎么清洗订单 编辑:程序博客网 时间:2024/05/24 05:58

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;}
 
原创粉丝点击