数据结构实验之求二叉树后序遍历和层次遍历(SDUT 2137)
Problem Description
已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历。
Input
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。
Output
每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列。
Sample Input
2
abdegcf
dbgeafc
xnliu
lnixu
Sample Output
dgebfca
abcdefg
linux
xnuli
/** By Mercury_LC */
/** https://blog.csdn.net/Mercury_Lc */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
    char data;  // 储存字符
    struct node *lc, *rc;   // 左右节点
};
char preorder[100]; // 前序
char inorder[100];  // 中序
struct node *creat(int len, char *preorder, char *inorder)  /* 根据前序中序建立二叉树*/
{
    struct node *root;
    int i;
    if(len == 0) return NULL;   // 如果长度为零,则不能建树
    root = (struct node*)malloc(sizeof(struct node));  // 申请新的节点
    root -> data = preorder[0];  // 前序的顺序第一个一定是根节点
    for(i = 0; i < len; i ++)  // 寻找中序中到根节点,即现在的这颗树的所有左子树
    {
        if(inorder[i] == preorder[0])break;  // 找到跳出循环
    }
    root -> lc = creat(i, preorder + 1, inorder);  // 建左子树
    root -> rc = creat(len - i - 1, preorder + i + 1, inorder + i + 1); // 建右子树
    return root;  // 返回根节点。
};
void level_traversal(struct node *root)  /* 层次遍历*/
{
    if(root == NULL) return;   // 树不存在
    struct node *queue[10005], *now;  // 建立队列
    int front = 0;   // 队首、尾初始化
    int rear = 0;
    queue[rear ++] = root;  // 入队
    while(front < rear)
    {
        now = queue[front ++]; // 出队
        printf("%c", now -> data);
        if(now -> lc != NULL)  // 左子树
        {
            queue[rear++] = now -> lc;
        }
        if(now -> rc != NULL)  // 右子树
        {
            queue[rear++] = now -> rc;
        }
    }
}
void postorder_traversal(struct node *root)  // 后序遍历,顺序:左子树-右子树-根
{
    if(root)
    {
        postorder_traversal(root->lc);
        postorder_traversal(root->rc);
        printf("%c",root->data);
    }
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%s%s",preorder,inorder);
        struct node *root;
        int len = strlen(preorder);
        root = creat(len,preorder,inorder);
        postorder_traversal(root);
        printf("\n");
        level_traversal(root);
        printf("\n");
    }
    return 0;
}
												
											数据结构实验之求二叉树后序遍历和层次遍历(SDUT 2137)的更多相关文章
- python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)
		
python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...
 - 二叉树后序遍历的非递归算法(C语言)
		
首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问 ...
 - PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)
		
前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...
 - SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
		
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...
 - <二叉树的基本操作(有层次遍历)>
		
#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK ...
 - LeetCode:145_Binary Tree Postorder Traversal | 二叉树后序遍历 | Hard
		
题目:Binary Tree Postorder Traversal 二叉树的后序遍历,题目要求是采用非递归的方式,这个在上数据结构的课时已经很清楚了,二叉树的非递归遍历不管采用何种方式,都需要用到栈 ...
 - lintcode.68  二叉树后序遍历
		
二叉树的后序遍历 描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的后序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返 ...
 - [Leetcode] Binary tree postorder traversal二叉树后序遍历
		
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
 - 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)
		
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...
 
随机推荐
- Iedis - Redis 在IDEA中的可视化工具破解
			
2.如何破解 // 如果你没有改动IDEA的话,IDEA的插件库在这个目录下C:\Users\Administrator\.IntelliJIdea2017.3\config\plugins\Iedi ...
 - 服务器上office不能正常使用?
			
(1)确保dll版本和服务器上office版本一致 (2)配置dcom (3)项目配置文件中添加用户模拟语句 <system.web> <identity impersonate=& ...
 - SqlServer学习之存储过程
			
前言:对于存储过程一直有一种抵触的心理,因为毕业至今所在的公司开发组都不是很规范,对于开发的一些注意事项并没有很多的规定,只是在知乎上查找相关知识的时候,看到很多人对于在程序里使用存储过程的不好之处都 ...
 - JSON在JS中的应用
			
一. JSON在JS中的应用: 首先解释下JSON对象与普通js对象字面量定义时格式的区别: Js对象字面量定义格式: var person = { name:"Wede", ag ...
 - POJ1845Sumdiv题解--约数之和
			
题目链接 https://cn.vjudge.net/problem/POJ-1845 分析 \(POJ\)里的数学题总是这么妙啊 首先有一个结论就是\(A=\prod{ \ {p_i}^{c_i} ...
 - JS数组判断,方法
			
怎么判断一个对象是不是数组? 首先可以用 ES5 提供的 isArray 方法进行判断(注意:Array.isArray是ES 5.1推出的,不支持IE6~8,所以在使用的时候也应注意兼容问题. ) ...
 - poi的基本导入
			
一.获取列的值 private String getCell(Cell cell){ if(null == cell){ return ""; } try{ cell.setCel ...
 - 【转】SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递
			
实现思路: 1:准备一个ThreadLocal变量,供线程之间共享. 2:每个微服务对所有过来的Feign调用进行过滤,然后从请求头中获取User用户信息,并存在ThreadLocal变量中. 3:每 ...
 - opencv3.0中contrib模块的添加+实现SIFT/SURF算法
			
平台:win10 x64 +VS 2015专业版 +opencv-3.x.+CMake+Anaconda3(python3.7.0) Issue说明:Opencv3.0版本已经发布了有一段时间,在这段 ...
 - linux-2.6.38poll机制简析(以tiny6410按键中断程序为基础)
			
一.应用程序 /* struct pollfd { int fd; //文件描述符 short events; //表示请求检测的事件 short revents; //表示检测之后返回的事件 }; ...