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实现二叉树遍历算法
说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...
随机推荐
- Delphi XE5 for Android (三)
在VCL下,常用的询问对话框包括 procedure TfrmMainVCL.btnAppMessageboxClick(Sender: TObject); begin if Applicatio ...
- 【前端】纯html+css+javascript实现楼层跳跃式的页面布局
实现效果演示: 实现代码及注释: <!DOCTYPE html> <html> <head> <title>楼层跳跃式的页面布局</title&g ...
- Python3基础 assert 断言 确保程序的正确运行条件
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Linux必备知识
一.Linux命令行常用快捷键 在企业工作中,管理Linux时—般不会直接采用键盘.显示器登录系统,而是会通过网络在远程进行管理,因此,需要通过远程连接具连接到Linux系统中.目前最常用的Linux ...
- linux下如何源码安装expect
1.作用 自动交互.比如如果用ssh登陆服务器,每次都输入密码,然而你觉得麻烦,那你就可以使用expect来做自动交互,这样的话就不用每次都输入密码 2.依赖 依赖tcl 3.获取源码 wget ht ...
- 【第三十七章】 springboot+docker(手动部署)
一.下载centos镜像 docker pull hub.c.163.com/library/centos:latest docker tag containId centos:7 docker ru ...
- poj 8469 特殊密码锁
a:特殊密码锁 总时间限制: 1000ms 内存限制: 1024kB 描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头 ...
- 【转载】Multiboot规范
转自:Multiboot规范 Multiboot规范 本文定义了Multiboot规范--提议中的引导过程标准.本文是此规范的0.6.93版. Multiboot规范简介 本章描述了一些关于Multi ...
- vim E437: terminal capability "cm" required
报错E437: terminal capability "cm" required 解决方法:# export TERM=xterm
- URL重写与URL路由
要介绍这两个内容,必须要从ASP.NET管线说起. ASP.NET管线 管线(Pipeline)这个词形象地说明了每个Asp.net请求的处理过程: 请求是在一个管道中,要经过一系列的过程点,这些过程 ...