【1086】Tree Traversals Again (25 分)

简介: 【1086】Tree Traversals Again (25 分)【1086】Tree Traversals Again (25 分)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>  
#include<map>
#include<vector>
#include<queue>
#include<stack>
using namespace std;  
const int maxn=50;
struct node{
  int data;
  node* lchild;
  node* rchild;
};
int pre[maxn],in[maxn],post[maxn]; //先、中、后序
int n;  //结点个数
//当前二叉树的先序序列区间为[preL,preR],中序序列区间为[inL,inR]
//create函数返回构建出的二叉树的根结点地址
node* create(int preL,int preR,int inL,int inR){
  if(preL>preR){
    return NULL;
  }
  node* root=new node;//新建一个新的结点,用来存放当前二叉树的根结点
  root->data=pre[preL];//新结点的数据域为根结点的值
  int k;//这个k不要在for里面定义了,注意有效域
  for(k=inL;k<=inR;k++){
    if(in[k]==pre[preL]){  //在中序序列中找到in[k]==pre[L]的结点
      break;
    }
  }
  int numLeft=k-inL; //左子树的结点个数
  //返回左子树的根结点地址,赋值给root的左指针
  root->lchild=create(preL+1,preL+numLeft,inL,k-1);
  //返回右子树的根结点地址,赋值给root的右指针
  root->rchild=create(preL+numLeft+1,preR,k+1,inR);
  return root;  //返回根结点地址
}
int num=0;//已输出的结点个数
void postorder(node* root){//后序遍历
  if(root==NULL){
    return;
  }
  postorder(root->lchild);
  postorder(root->rchild);
  printf("%d",root->data);
  num++;
  if(num<n)  printf(" ");
}
int main(){   
  scanf("%d",&n);
  char str[5];
  stack<int> st;
  int x,preIndex=0,inIndex=0;  //入栈元素、先序序列位置及中序序列位置
  for(int i=0;i<2*n;i++){ //出栈入栈共2n次
    scanf("%s",str);
    if(strcmp(str,"Push") == 0){  //入栈
      scanf("%d",&x);
      pre[preIndex++]=x;   //令pre[preIndex]=x
      st.push(x);
    }else{
      in[inIndex++]=st.top();  //令in[inIndex]=st.top
      st.pop();
    }
  }
  node* root=create(0,n-1,0,n-1);  //建树
  postorder(root);  //后序遍历
  system("pause");
    return 0;   
}
相关文章
|
机器学习/深度学习 存储 C++
【PAT甲级 - C++题解】1123 Is It a Complete AVL Tree
【PAT甲级 - C++题解】1123 Is It a Complete AVL Tree
87 0
|
人工智能 BI
UPC-Coloring Edges on Tree(树的DFS)
UPC-Coloring Edges on Tree(树的DFS)
82 0
【1020】Tree Traversals (25 分)
【1020】Tree Traversals (25 分) 【1020】Tree Traversals (25 分)
91 0
【1151】LCA in a Binary Tree (30分)【倍增法解决LCA】
增法的介绍可以先看下 https://blog.csdn.net/lw277232240/article/details/72870644详细介绍倍增法
83 0
【1110】Complete Binary Tree (25分)【完全二叉树】
【1110】Complete Binary Tree (25分)【完全二叉树】 【1110】Complete Binary Tree (25分)【完全二叉树】
117 0
1086. Tree Traversals Again (25)
//push是前序遍历 pop是中序遍历 根据前序遍历和中序遍历 输出后序遍历 #include #include #include using namespace std; int n; vector pre, in...
812 0
1020. Tree Traversals (25)
//给定后序和中序遍历 要求输出层序遍历 #include #include #include using namespace std; const int maxn = 31; int n; struct node ...
685 0