二叉树
前序遍历顺序: 根节点、左子树、右子树
中序遍历顺序: 左子树、根节点、右子树
后序遍历顺序: 左子树、右子树、根节点
可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。
举个例子,前序 5 3 2 4 8 6 10 中序 2 3 4 5 6 8 10
首先,5肯定是二叉树的根节点,然后5在中序里面的位置是3号(从0开始),此位置前面的是左子树中的节点,右面的是右子树的节点,即5 || 3 2 4|| 8 2 6 , 2 3 4 || 5 || 6 8 10,对红色的左子树序列、蓝色的右子树序列继续上述过程,直至结束。
已知前序中序求后序:
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int, int> PI; typedef pair< PI, int> PII; const double eps=1e-5; const double pi=acos(-1.0); const int mod=1e9+7; const int INF=0x3f3f3f3f; const int MAXN=1100; #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 int mid[10500]; int pre[10500]; void solve(int a,int b,int n,bool flag) { if(n==1) //此时只有一个节点 { cout<<pre[a]<<" "; return ; } if(n<=0) { return ; } int pos; //找到节点 for(pos=0; pre[a]!=mid[b+pos]; pos++); solve(a+1,b,pos,0); //左子树 solve(a+pos+1,b+pos+1,n-pos-1,0); //右 if(flag) //根节点 { cout<<pre[a]<<endl; } else { cout<<pre[a]<<" "; } } int main() { int n; cin>>n; for(int i=1; i<=n; ++i) { cin>>pre[i]; } for(int i=1; i<=n; ++i) { cin>>mid[i]; } solve(1,1,n,1); return 0; }
已知后序中序求前序:
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int, int> PI; typedef pair< PI, int> PII; const double eps=1e-5; const double pi=acos(-1.0); const int mod=1e9+7; const int INF=0x3f3f3f3f; const int MAXN=1100; #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 int mid[10500]; int pre[10500]; //此时为后序 void solve(int a,int b,int n,bool flag) { if(n==1) //此时只有一个节点 { cout<<" "<<pre[a]; return ; } if(n<=0) { return ; } if(flag) //根节点 { cout<<pre[a]; } else { cout<<" "<<pre[a]; } int pos; //找到节点 for(pos=0; pre[a]!=mid[b+pos]; pos++); solve(a-n+pos,b,pos,0); //左子树 solve(a-1,b+pos+1,n-pos-1,0); //右 } int main() { int n; cin>>n; for(int i=1; i<=n; ++i) { cin>>pre[i]; } for(int i=1; i<=n; ++i) { cin>>mid[i]; } solve(n,1,n,1); //后序最后一点为根 return 0; }
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/1031 (转载时请注明本文出处及文章链接)
1 条评论