标签:结构体 while 链接 变量 dex 相同 排序 size sort
链接
用栈的形式给出一棵二叉树的建立的顺序,求这棵二叉树的后序遍历
void dfs(int root, int st, int ed){
if(st > ed) return; //中序长度小于等于0
int i = st;
while(i<=st&&in[i]!=pre[root]) i++;
dfs(root+1, st, i-1);
dfs(root+i-st+1, i+1, ed);
ans.push_back(pre[root]);
}
struct node {
int index, value;
};
bool cmp(node a, node b) {
return a.index < b.index;
}
vector<int> post, in;
vector<node> ans;
void dfs(int root, int st, int ed, int idx) {
if (st > ed) return;
int i = st;
while (i <= end && in[i] != post[root]) i++;
ans.push_back({idx, post[root]});
dfs(root - 1 - ed + i, st, i - 1, 2 * idx + 1);
dfs(root - 1, i + 1, ed, 2 * idx + 2);
}
pre(n - 1, 0, n - 1, 0);
sort(ans.begin(), ans.end(), cmp);
#include<bits/stdc++.h>
using namespace std;
vector<int> pre, in, post, value;
stack<int> s;
int n,num,key;
char str[10];
//先序对应入栈,中序对应出栈
//一直先序,中序,求后序
void dfs(int root, int st, int ed){
if(st > ed) return;
int i = st;
while(i<=ed && in[i] != pre[root]) i++;
//左右根
dfs(root+1, st, i-1);
dfs(root+(i-st+1), i+1, ed);
post.push_back(pre[root]);
}
int main(){
scanf("%d",&n);
while(~scanf("%s", str)){
if(strlen(str) == 4){
scanf("%d",&num);
pre.push_back(key); //前中后序均保存key,避免值相同而出现问题
value.push_back(num);
s.push(key++);
}else{
in.push_back(s.top());
s.pop();
}
}
dfs(0, 0, n-1);
for(int i=0;i<post.size();i++){
if(i==0) printf("%d",value[post[i]]);
else printf(" %d",value[post[i]]);
}
printf("\n");
}
PAT A1086 Tree Traversals Again [二叉树前序中序求后序]
标签:结构体 while 链接 变量 dex 相同 排序 size sort
原文地址:https://www.cnblogs.com/doragd/p/11284500.html