HDU 1710 二叉树遍历
首先。先序遍历是先访问根节点。然后左节点 然后右节点。从根节点开始 直到它的子节点没有左节点才开始回溯访问上一个节点的右节点。同理。中序遍历 先访问左节点 然后是父节点 然后是右节点。从根节点开始 直到它的孩子节点没有左节点 才开始回溯访问该节点 然后是它的父节点 然后是它的兄弟右节点。也就是说 每次访问一个节点时 它的左节点已经被访问过了。访问过之后 就要访问它的 右节点。(有点醉T_T.......)后续遍历。从根节点开始 直到叶子节点。先访问左节点 然后是右节点。然后回溯访问父节点。注意回溯到总的根节点时不能直接访问 还要像左子树一样遍历到叶子节点访问完左右节点时才能访问该节点。也就是说。每次访问一个节点 都要确定它的左右节点都已经被访问完。。。。。。。赤果果的深搜啊。。。。。。。。
额....这个题是给你先序和中序求后序。也可以根据后序和中序写出前序。但是不可能根据前序和后序求中序...(然而我并不懂为什么.........)
明白了这些....这就是dfs了...注意好好理解前序确定父节点的信息....中序确定左右子树的元素....于是唯一确定了后序数列....附代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stack>
using namespace std;
int pre[1010], in[1010];
stack<int>aft; //存放父节点。即后续遍历数列。
void build(int l1, int r1, int l2, int r2) // l1,r1表示前序遍历数组的开始和结尾。 l2和r2表示中序遍历数组的开始和结尾。
{
int i;
aft.push(pre[l1]); // 父节点入栈
for (i=l2; i<=r2; ++i)
{
if (pre[l1] == in[i])
break; //找到父节点在中序遍历数组里的位置。
}
int j = l1+(i-l2+1); //找到右子树的父节点在先序数组里的位置。即左子树和右子树在先序遍历的分界点
if (j<=r1 && i+1<=r2) // 该节点在中序遍历数组里右边还有数即存在右子树,且右子树父节点在先序范围里
{
build(j, r1, i+1, r2); // 求解右子树.因为要求的是后续遍历数列而且存储在栈中。所以每次先找右子树。再找左子树。
}
if (l1+1<=j-1 && l2<=i-1)
{
build(l1+1, j-1, l2, i-1); // 求解左子树。
}
}
int main()
{
int n;
while (cin >> n)
{
for (int i=0; i<n; ++i)
{
cin >> pre[i];
}
for (int i=0; i<n; ++i)
{
cin >> in[i];
}
build(0, n-1, 0, n-1);
bool flag = true;
while(!aft.empty())
{
if (flag)
{
cout << aft.top();
flag = false;
}
else
{
cout << ' ' << aft.top();
}
aft.pop();
}
cout << endl;
}
return 0;
}
HDU 1710 二叉树遍历的更多相关文章
- HDU 1710 二叉树遍历,输入前、中序求后序
1.HDU 1710 Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分 ...
- hdu 1710 二叉树的遍历
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1710 大意:给出一个二叉树的前序和中序,求其后序遍历 ps:1.在写链表时,需要写明typedef str ...
- HDU 1710 二叉树三种遍历
Binary Tree Traversals Problem Description A binary tree is a finite set of vertices that is either ...
- HDU 1710 二叉树的遍历 Binary Tree Traversals
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu1710(Binary Tree Traversals)(二叉树遍历)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 1710 Binary Tree Traversals(二叉树)
题目地址:HDU 1710 已知二叉树先序和中序求后序. #include <stdio.h> #include <string.h> int a[1001], cnt; ty ...
- hdu 4605 线段树与二叉树遍历
思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...
- C++ 二叉树遍历实现
原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...
- python实现二叉树遍历算法
说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...
随机推荐
- STM32.SPI(25Q16)
1.首先认识下W25Q16DVSIG, SOP8 SPI FLASH 16MBIT 2MB(4096个字节) (里面可以放字库,图片,也可以程序掉电不丢失数据放里面) 例程讲解: ① 1.用到SPI ...
- 九数组分数|2015年蓝桥杯B组题解析第五题-fishers
九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h> void t ...
- mysql 通过binlog 查看执行日志
环境:linux deepin15.7 mysql 5.7 1.开启binlog vim /etc/mysql/mysql.conf.d/mysqld.cnf 添加 log_bin = /var/ ...
- winform中splitter的用法
1.将winform分为三列 整个窗体分成可以自动调节的三列的做法:1.往窗体上丢两个panel控件其中:panelLeft——设置Dock属性为“left”,并调节好其宽度panelRight——设 ...
- Educational Codeforces Round 56 (Rated for Div. 2)
涨rating啦.. 不过话说为什么有这么多数据结构题啊,难道是中国人出的? A - Dice Rolling 傻逼题,可以用一个三加一堆二或者用一堆二,那就直接.. #include<cstd ...
- Chromosome coordinate systems: 0-based, 1-based
From: https://arnaudceol.wordpress.com/2014/09/18/chromosome-coordinate-systems-0-based-1-based/ I’v ...
- POJ 1625 Censored!(AC自动机+高精度+dp)
http://poj.org/problem?id=1625 题意: 给出一些单词,求长度为m的串不包含这些单词的个数. 思路: 这道题和HDU 2243和POJ 2778是一样的,不同的是这道题不取 ...
- BZOJ 2648 kd-tree模板
学习了一下kd-tree的基本写法 http://blog.csdn.net/jiangshibiao/article/details/34144829 配合 http://www.bilibili. ...
- spring boot开发 静态资源加载不出来
spring boot 1.5 版本之前 不拦截静态资源 springboot 2.x版本 拦截静态资源 private static final String[] CLASSPATH_RESOURC ...
- Flutter学习笔记(一)
记得flutter出来的时候,官方推荐的是使用IntelliJ IDEA,当时个人尝试了一下,比较麻烦,整个过程比较漫长. 进入2018年,再去看的时候,官方推荐使用Android Studio和VS ...