codevs 1013 求先序排列

简介: 题目链接:http://codevs.cn/problem/1013/题目描述 Description给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度rchild=CreateBT2(post+k,p+1,n-k-1); //递归构造右子树3...

题目链接:http://codevs.cn/problem/1013/

题目描述 Description

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。

输入描述 Input Description

两个字符串,分别是中序和后序(每行一个)

输出描述 Output Description

一个字符串,先序

样例输入 Sample Input

BADC

BDCA

样例输出 Sample Output

ABCD

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 
 5 #define MaxSize 100
 6 
 7 typedef char ElemType;
 8 typedef struct node 
 9 {    
10     ElemType data;            //数据元素
11     struct node *lchild;    //指向左孩子结点
12     struct node *rchild;    //指向右孩子结点
13 } BTNode;
14 
15 BTNode *CreateBT2(char *post,char *in,int n)
16 /*post存放后序序列,in存放中序序列,n为二叉树结点个数,
17 本算法执行后返回构造的二叉链的根结点指针*/
18 {
19     BTNode *s;
20     char r,*p;
21     int k;
22     if (n<=0) return NULL;
23     r=*(post+n-1);                            //根结点值
24     s=(BTNode *)malloc(sizeof(BTNode));        //创建二叉树结点*s
25     s->data=r;
26     for (p=in;p<in+n;p++)                    //在in中查找根结点
27         if (*p==r)
28             break;
29     k=p-in;                                    //k为根结点在in中的下标
30     s->lchild=CreateBT2(post,in,k);            //递归构造左子树
31     s->rchild=CreateBT2(post+k,p+1,n-k-1);    //递归构造右子树
32     return s;
33 }
34 void PreOrder1(BTNode *b)    //先序非递归遍历算法
35 {
36     BTNode *St[MaxSize],*p;
37     int top=-1;
38     if (b!=NULL) 
39     {   
40         top++;                        //根结点进栈
41         St[top]=b;
42         while (top>-1)                //栈不为空时循环
43         {
44             p=St[top];                //退栈并访问该结点
45             top--;
46             printf("%c",p->data);
47             if (p->rchild!=NULL)    //右孩子结点进栈
48             {
49                 top++;
50                    St[top]=p->rchild;
51             }
52             if (p->lchild!=NULL)    //左孩子结点进栈
53             {
54                 top++;
55                    St[top]=p->lchild;
56             }
57         }
58         printf("\n");
59     }
60 }
61 int main(int argc, char *argv[])
62 {
63     char str1[MaxSize],str2[MaxSize];//str1:中序序列,str2:后序序列 
64     BTNode *bt;
65     scanf("%s%s",str1,str2);
66     bt=CreateBT2(str2,str1,strlen(str1));
67     PreOrder1(bt);
68     return 0;
69 }

 

相关文章
|
7月前
|
算法 搜索推荐 JavaScript
NodeJ实现冒泡算法
NodeJ实现冒泡算法
56 0
|
人工智能 BI
牛客 序列排列1
牛客 序列排列1
68 0
|
7月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 199. 二叉树的右视图 算法解析
☆打卡算法☆LeetCode 199. 二叉树的右视图 算法解析
|
算法
代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
54 0
|
算法 C++
剑指offer(C++)-JZ38:字符串的排列(算法-搜索算法)
剑指offer(C++)-JZ38:字符串的排列(算法-搜索算法)
每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题
每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题
|
存储 算法
回溯算法:排列与组合详解
回溯算法,本质上是一种穷举算法,属于暴力搜索算法的一种。它虽然可以使用剪枝进行优化,仍不高效,但却实用。它往往能够解决可以抽象成树形结构的问题,亦可以认为是使用 K 层 for循环实现搜索的问题。
167 0
回溯算法:排列与组合详解
|
算法 索引
【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #
【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #
|
算法 C++
算法基础(三)| 二分图解及代码模板
⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果。本专栏面向算法零基础但有一定的C++基础的学习者。
96 0
|
算法 前端开发 程序员
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️
109 0
「LeetCode」剑指Offer-32从上到下打印二叉树 ⚡️