二叉树的创建·^遍历^手工算法

已知先序中序求后序

#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

后序用左右根一样的就不写了

 

posted @   ganl啦  阅读(404)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
点击右上角即可分享
微信分享提示