二叉树重建
二叉树的遍历学列:先序序列,中序序列,后序序列,逆先序序列,逆后续序列
只要有一个中序序列再加上另一个序列就可唯一地重建原来二叉树。
可到这里测试下:http://acm.pku.edu.cn/JudgeOnline/problem?id=2255
#include <iostream>
using namespace std;
typedef char Type;
typedef struct Node
{
Type data;
Node *lc, *rc;
Node(Type e='\0') : data(e) {}
}Node;
Node* Rebuild(Node *FirstArr[], Node *MidArr[], int n)
{
if(n<1) return NULL;
if(n==1) {
FirstArr[0]->lc = FirstArr[0]->rc = NULL;
return FirstArr[0];
}
Node *head = FirstArr[0];
int i=0, len = 0;
for(i=0, len=0; head != MidArr[i] && i<n; i++)
{
len++;
}
head->lc = Rebuild(FirstArr+1, MidArr, len);
head->rc = Rebuild(FirstArr+1+len, MidArr+1+len, n-1-len);
return head;
}
void postOrder(Node *head)
{
if(head){
postOrder(head->lc);
postOrder(head->rc);
printf("%c\t", head->data);
}
}
int main()
{
const int n = 7;
Node *FirstArr[n], *MidArr[n];
Node node[n] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
int f[] = {0,1,2,3,4,5,6}; // 先序序列
int m[] = {2,1,4,3,0,5,6}; // 中序序列
for(int i=0; i<n; i++)
{
FirstArr[i] = &node[ f[i] ];
MidArr[i] = &node[ m[i] ];
}
Node *head = Rebuild(FirstArr, MidArr, n);
postOrder(head); // 后序序列
printf("\n");
return 0;
}
分享到:
相关推荐
在本课程设计中,重点是通过先序和中序遍历序列来唯一地重建二叉树。 题目要求程序能够根据用户输入的先序和中序遍历序列来构建二叉树。先序遍历的顺序是根节点 -> 左子树 -> 右子树,而中序遍历的顺序是左子树 -> ...
### C语言实现二叉树的重建源码解析 在计算机科学中,二叉树是一种重要的数据结构,广泛应用于算法设计和程序开发中。本篇文章将深入解析如何使用C语言实现二叉树的重建,以及其背后的逻辑与算法原理。 #### ...
二叉树是树的一种特殊形式,每个节点最多只有两个子节点,通常分为左子节点和右子节点。树与二叉树之间的转换是一个重要的概念,尤其是在数据结构和算法的学习中。下面我们将详细探讨这个主题。 一、树到二叉树的...
python 四种方法解析重建二叉树,七种方法遍历二叉树 四种方法解析重建二叉树包括: 1、通过对象实例的左右儿子方法重建 2、通过键盘输入先序遍历重建 3、通过先序遍历的列表重建 4、通过层序遍历列表重建 七种方法...
二叉树重建问题是一个经典的数据结构问题,它涉及到对二叉树的三种主要遍历方式的理解:前序遍历、中序遍历和层次遍历。在这个问题中,我们已经得到了一个二叉树的前序遍历和中序遍历序列,目标是输出该二叉树的层次...
从给定的文件标题“ACM常用模板及北大ACM-题型分类代码”和描述“ACM常用模板及北大ACM-题型分类代码 c/c++”,我们可以深入挖掘一系列重要的编程技巧和算法,这些都是在解决ACM竞赛问题时常用的策略。下面,我们将...
本次课程设计的主题是“二叉树的遍历及树与二叉树的转换”,这涉及到两个核心概念:二叉树的遍历方法和树与二叉树之间的转化。 首先,我们来深入理解二叉树的遍历。二叉树是由节点构成的数据结构,每个节点最多有两...
【北大ACM题解答代码】是一份集合了50道北京大学ACM竞赛题目解题思路与源代码的资源,对于想要提升编程技能、学习算法竞赛策略的编程爱好者来说,这是一份非常宝贵的学习资料。ACM(国际大学生程序设计竞赛,...
### 关于二叉树的基本操作解析 #### 一、初始化二叉树 `InitBTree` 在二叉树的创建过程中,第一步通常是初始化一个空的二叉树。这一步非常重要,因为所有的后续操作都需要基于这个初始状态来进行。 ```cpp void ...
本文将深入探讨二叉树的前序遍历、后序遍历以及如何根据这两种遍历结果重建原始的二叉树。 ### 前序遍历(Preorder Traversal) 前序遍历是一种访问二叉树节点的方式,其顺序是:根节点 -> 左子树 -> 右子树。这种...
### 森林转换成二叉树:C语言实现的数据结构算法详解 #### 知识点一:数据结构定义 在本段代码中,我们首先遇到了三种数据结构的定义: 1. **`CTreeNode`**: 表示森林中的树节点。每个节点包含一个字符型数据`...
在ACM/ICPC(国际大学生程序设计竞赛)中,BFS是解决许多问题的关键技术之一,尤其在2015年北京大学举办的暑期课程中,这一主题被重点讲解。 BFS的基本思想是从根节点开始,沿着图的宽度方向层层展开,先访问离起点...
北京大学的POJ_ACM解题报告是一份宝贵的资源,它为ACM(国际大学生程序设计竞赛)新手提供了丰富的学习材料。POJ(Problem Online Judge)是北京大学开发的一个在线编程题库,它为参赛者提供了大量的算法题目进行...
这个题库是北京大学为培养学生的算法思维和编程能力而编纂的,包含了大量精心挑选的编程题目。CHM(Compiled Help Manual)格式是一种常见的帮助文档格式,通常用于存储结构化的电子书或手册,便于用户查阅和学习。 ...
《浙江大学ACM题解JU_ACM_All_Anwer》是一份极为宝贵的资源,它集结了浙江大学在ACM(国际大学生程序设计竞赛)历年来的题目及其解答。这份资料以CHM电子书的形式呈现,方便读者查阅和学习。对于那些对ACM编程竞赛感...
【描述】"北京大学acm网站50个题目源代码。感兴趣的可以借鉴。"说明这份资源是从北京大学的ACM竞赛训练网站获取的,包含了50道不同问题的解决方案。它提供了一个学习和参考的平台,特别是对于那些对算法设计和实现有...
首先,森林中的每棵树单独转换为二叉树,这一过程遵循上述树转二叉树的规则。 #### 2. 连接二叉树 接下来,从第二棵二叉树开始,将其根节点作为前一棵二叉树根节点的右孩子节点,并以此类推,最终形成一棵由多棵树...
10. **PKU report**:这个文件可能是北京大学ACM队伍的报告,可能包含了他们的训练方法、比赛心得、常见错误分析等,对于参赛者来说具有极高的参考价值。 综上所述,【北大ACM题库解析】不仅提供了大量的练习题目和...
二叉树和森林是两种常见的数据结构,在计算机科学和算法设计中扮演着重要角色。它们在许多场景下被广泛使用,如文件系统、编译器设计、图形算法等。理解和掌握二叉树与森林之间的转换对于提升编程能力及解决实际问题...