题目:

思路:

这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿子。

用for遍历一遍所有的节点,让每一个节点都连接到它的父亲,最后从根节点开始访问即可。

代码:

//
// main.cpp
// Tree
//
// Created by wasdns on 16/12/19.
// Copyright ? 2016年 wasdns. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; struct Node
{
int num; Node *lnext, *rnext;
}; int fa[10005]; //父亲 Node* node[100005]; //节点 int midorder[100005]; //中序 int preorder[100005]; //先序 int aftorder[100005]; //后序 int tot = 0; /*
Ininode函数:初始化各个节点
*/
void Ininode(int n)
{
for (int i = 1; i <= n; i++)
{
Node *p = new Node; p -> num = i;
p -> lnext = NULL;
p -> rnext = NULL; node[i] = p;
}
} /*
isleft函数:判断儿子是左儿子还是右儿子
*/
bool isleft(int n, int num, int f)
{
bool ans = true; for (int i = 1; i <= n; i++)
{
if (midorder[i] == num || midorder[i] == f)
{
if (midorder[i] == f) {
ans = false;
} break;
}
} return ans;
} /*
CreatTree:建树
*/
Node* CreatTree(int n)
{
int i; int fanum; for (i = 2; i <= n; i++)
{
fanum = fa[i]; if (isleft(n, i, fanum)) {
node[fanum] -> lnext = node[i];
} else {
node[fanum] -> rnext = node[i];
}
} return node[1];
} /*
CalPreorder函数:计算先序
*/
void CalPreorder(Node *p)
{
if (p -> lnext == NULL && p -> rnext == NULL) { preorder[tot++] = p -> num; return ;
} preorder[tot++] = p -> num; if (p -> lnext != NULL) CalPreorder(p -> lnext); if (p -> rnext != NULL) CalPreorder(p -> rnext);
} /*
CalAftorder函数:计算后序
*/
void CalAftorder(Node *p)
{
if (p -> lnext == NULL && p -> rnext == NULL) { aftorder[tot++] = p -> num; return ;
} if (p -> lnext != NULL) CalAftorder(p -> lnext); if (p -> rnext != NULL) CalAftorder(p -> rnext); aftorder[tot++] = p -> num;
} /*
PrintTree函数:中序遍历(queue思想)输出树
*/
void PrintTree(Node *head)
{
queue<Node*> q; q.push(head); Node *p; while (!q.empty())
{
p = q.front(); q.pop(); cout << p -> num << " "; if (p -> lnext != NULL) {
q.push(p -> lnext);
} if (p -> rnext != NULL) {
q.push(p -> rnext);
}
} cout << endl;
} /*
Print函数:输出结果
*/
void Print(int n)
{
int i; for (i = 0; i < n; i++) {
cout << preorder[i] << " ";
} cout << endl; for (i = 0; i < n; i++) {
cout << aftorder[i] << " ";
} cout << endl;
} int main()
{
int n; cin >> n; int i; for (i = 1; i <= n; i++) {
cin >> fa[i];
} for (i = 1; i <= n; i++) {
cin >> midorder[i];
} Ininode(n); Node* head; head = new Node; head = CreatTree(n); //PrintTree(head); CalPreorder(head); tot = 0; CalAftorder(head); Print(n); return 0;
}

2016/12/19

DS实验题 Order 已知父节点和中序遍历求前、后序的更多相关文章

  1. DS实验题 order

    算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...

  2. DS实验题 融合软泥怪-2 Heap实现

    题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...

  3. DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储

    题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...

  4. HDU1710---树(知前序遍历与中序遍历 求后序遍历)

    知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...

  5. 数据结构实验之求二叉树后序遍历和层次遍历(SDUT 2137)

    Problem Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据. ...

  6. DS实验题 Dijkstra算法

    参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...

  7. DS实验题 sights

    算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...

  8. DS实验题 PlayGame Kruskal(UnionFindSet)

    题目: 思路: 有两种做法,一种是Prim算法,另外一种则是我所使用的Kruskal算法,Kruskal的算法实现可以参考:最小生成树-Prim算法和Kruskal算法,讲的已经是十分清楚了. 具体算 ...

  9. PAT A1020——已知后序中序遍历求层序遍历

    1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Give ...

随机推荐

  1. 20145223《Java程序程序设计》第2周学习总结

    20145223 <Java程序设计>第2周学习总结 教材学习内容总结 一: 1.基本的类型: (1)整数:short(2字节).int(4字节).long(8字节) (2)字节 byte ...

  2. TCP/IP详解2 学习笔记---mbuf

    1,mbuf就是存储要发送数据的memery buf,类似于skb_buf.不过结构比较简单. /* header at beginning of each mbuf: */ 这个结构用来描述mbuf ...

  3. Android自动化测试-Robotium(一)简介

    一.Robotium原理 Robotium是一款Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击.长按.滑动等).查找和断言机制的API ...

  4. The Parallel Challenge Ballgame[HDU1101]

    The Parallel Challenge Ballgame Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...

  5. BZOJ4378 : [POI2015]Logistyka

    对于每个询问,设不小于$s$的个数为$cnt$,小于$s$的和为$sum$. 那么如果可以进行$s$轮,当且仅当$sum\geq (c-cnt)\times s$. 权值线段树维护,时间复杂度$O(m ...

  6. awk 学习

    1. awk用例 今天用awk来统计一个字符出现的次数,总是比实际多一个.查了半天才发现问题所在. 文本tt.txt如下: <lst name="responseHeader" ...

  7. HDU 3090 (贪心)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3090 题目大意:一共n段路.每段路每千米都会被抢劫一定数量,可以雇佣武士护卫m千米.问最少被抢劫数量 ...

  8. Python for Informatics 第11章 正则表达式三(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 11.2 用正则表达式抽取数据 ...

  9. Android PhoneGap 利用 Activity 实现 CordovaInterface

    1.修改main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...

  10. Leetcode Combination Sum

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...