已知层次遍历和中序遍历求二叉树_pat 1020 Tree Traversals已知后序和中序求层序遍历(二叉树)...

好久没写二叉树遍历的相关东西,差点忘掉怎么写,特地记录一下:

重建二叉树的函数分别用两种方法实现了一下

详见代码:

#include

using namespace std;

typedef long long LL;

const int inf = 0x3f3f3f3f;

#define mp make_pair

#define pb push_back

#define fi first

#define se second

typedef struct Tree{

int num;

struct Tree *left;

struct Tree *right;

}Tree;

int a[35];

int b[35];

int n;

//p代表后序遍历的最后,q代表中序遍历的起点,

//len代表子树的长度

/*Tree* build(int p,int q,int len)

{

//cout << p << " " << q << " " << len << endl;

if(len == 0)

return NULL;

if(len == 1){

Tree* node = (Tree *)malloc(sizeof(Tree));

node -> num = b[q];

node -> left = NULL;

node -> right = NULL;

return node;

}

int root = q;

for(int i = q;i <= n;++i){

if(a[p] == b[i]){

root = i;

break;

}

}

Tree* node = (Tree *)malloc(sizeof(Tree));

node -> num = b[root];

node -> right = build(p - 1,root + 1,q + len - root - 1);

node -> left = build(p - q - len + root,q,root - q);

return node;

}*/

//这个是分别存放每个子树对应后序,中序的边界

//这个更简便点

Tree* build(int Lpost,int Rpost,int Lin,int Rin)

{

int Lnum,Rnum;

int mid;

for(int i = Lin;i <= Rin;++i){

if(b[i] == a[Rpost]){

Lnum = i - Lin;

Rnum = Rin - i;

mid = i;

break;

}

}

Tree* node = (Tree *)malloc(sizeof(Tree));

node -> num = a[Rpost];

if(Lnum){

node -> left = build(Lpost,Rpost - Rnum - 1,Lin,mid - 1);

}else{

node -> left = NULL;

}

if(Rnum){

node -> right = build(Rpost - Rnum,Rpost - 1,mid + 1,Rin);

}else{

node ->right = NULL;

}

return node;

}

int main()

{

Tree *root;

cin >> n;

for(int i = 1;i <= n;++i)

cin >> a[i];

for(int i = 1;i <= n;++i)

cin >> b[i];

root = build(1,n,1,n);

vectorve;

queueque;

que.push(root);

while(!que.empty())

{

Tree* tmp = que.front();

que.pop();

ve.pb(tmp -> num);

if(tmp -> left != NULL){

que.push(tmp -> left);

}

if(tmp -> right != NULL){

que.push(tmp -> right);

}

}

for(int i = 0;i < ve.size();++i){

if(i == ve.size() - 1){

printf("%d\n",ve[i]);

}else{

printf("%d ",ve[i]);

}

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值