二叉树的创建·^遍历^手工算法
已知先序中序求后序
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int pre[N],in[N],post[N]; // 先序.中序.后序
int k;
struct node{
int value;
node *l,*r;
node(int value = 0 , node *l = NULL , node *r = NULL) : value(value),l(l),r(r){} // 在结构体内构造一个函数方便以后给结构体赋值,详情请看——结构体构造函数
};
void buildtree(int l, int r , int &t,node* &root){// 建树,&在这里作“引用”,详情请看——引用详解
int flag = -1;
for(int i = l ; i <= r ; i++)
{
if(in[i]==pre[t]){
flag = i ;
break;
}
}
if(flag == -1) return;
root = new node(in[flag]); //给当前root创建一个内存空间,让root指向该空间的地址,则空间内的值即为root的value,且将in[flag]的值赋给value
t++;
if(flag>l) buildtree(l , flag - 1 , t , root->l); //递归思想写不下自己去学一下,然后再把本题样例拿草稿纸代入一下
if(flag<r) buildtree(flag + 1 , r , t , root->r);
}
//下面是三种遍历方法
void preorder(node *root){ //先序输出(应该能看懂就不解释了)
if(root!= NULL){
post[k++] = root->value;
preorder(root->l);
preorder(root->r);
}
}
void inorder(node *root){//中序输出
if(root!= NULL){
inorder(root->l);
post[k++] = root->value;
inorder(root->r);
}
}
void postorder(node *root){//后序输出
if(root != NULL){
postorder(root->l);
postorder(root->r);
post[k++] = root->value;
}
}
void remove_tree(node *root){//释放空间
if(root == NULL)return;
remove_tree(root->l);
remove_tree(root->r);
delete root;
}
int main()
{
int n;
while(~scanf("%d",&n)){
for(int i = 1 ; i <= n ; i++)scanf("%d",&pre[i]);
for(int j = 1 ; j <= n ; j++)scanf("%d",&in[j]);
node *root;
int t = 1;
buildtree(1 , n , t , root);
k = 0;
postorder(root);
for(int i = 0 ; i < k ; i++) printf("%d%c",post[i],i==k-1?'\n':' ');
remove_tree(root);
}
return 0;
}
样例:
输入:
9
1 2 4 7 3 5 8 9 6//先序
4 7 2 1 8 5 9 3 6//中序
输出:
7 4 2 8 9 5 6 3 1//后序
二叉树的手工算法:
给出任意一个二叉树,例如:
先序:
我们知道先序遍历是——根左右
则先将根 A 左 B 右 C写下来——ABC
对于B为根 有 BDE,直接将DE写在B后面——ABDEC
对于D为根 有 DH空,直接将H写在D后面——ABDHEC
后面同理 ——ABDHEIC
——ABDHEICFG
中序:
我们知道中序遍历是——左根右
则写下——BAC
然后对于B有DBE,则下成——DBEAC
同理加入HD——HDBEAC
加入IE——HDBIEAC
加入FCG——HDBIEAFCG
后序用左右根一样的就不写了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程