hdu--1710--二叉树的各种遍历间的联系

这题 是给你一个二叉树的 先序和中序遍历 让你推导出 后序遍历

蛮有意思的 ...当然 做这题的前提是要 先明白 二叉树的 先序 与 中序 后序 遍历分别是如何实现的

我这边 懒得提了 =_=

我直接贴上 代码吧   因为这真的是 数据结构的基本要求

你还可以去写下 中序与后序遍历 推导出 先序遍历的代码

我也一并贴上了

 1 //通过二叉树的 中序遍历和先序遍历 ---> 后序遍历
 2
 3 #include <iostream>
 4 using namespace std;
 5
 6 const int size = 1010;
 7 int pre[size];
 8 int in[size];
 9 bool flag;
10
11 void solve( int* pre , int* in , int len )
12 {
13     int index = 0;
14     if( len>=1 )
15     {
16         while( index < len && *pre != *(in+index) )
17             ++ index;
18         solve( pre+1 , in , index );//左子树
19         solve( pre+index+1 , in+index+1 , len-(index+1) );//右子树
20         if( flag )
21         {
22             cout << * pre;
23             flag = false;
24         }
25         else
26             cout << " " << *pre;
27     }
28 }
29
30 int main()
31 {
32     cin.sync_with_stdio(false);
33     int n;
34     while( cin >> n )
35     {
36         flag = true;
37         for( int i = 0 ; i<n ; i++ )
38         {
39             cin >> pre[i];
40         }
41         for( int i = 0 ; i<n ; i++ )
42         {
43             cin >> in[i];
44         }
45         solve( pre , in , n );
46         cout << endl;
47     }
48     return 0;
49 }

 1 //通过二叉树的 中序遍历和后序遍历 ---> 先序遍历
 2 #include <iostream>
 3 using namespace std;
 4
 5 const int size = 1010;
 6 int in[size];
 7 int post[size];
 8 bool flag;
 9
10 void solve( int* in , int* post , int len )
11 {
12     int pos = 0;
13     if( len>=1 )
14     {
15         while( pos<len  && *(in+pos) != *(post+len-1) )
16         {
17             ++ pos;
18         }
19         if( flag )
20         {
21             cout << *(in+pos);
22             flag = false;
23         }
24         else
25             cout << " " << *(in+pos);
26         solve( in , post , pos );//左子树
27         solve( in+pos+1 , post+pos , len-pos-1 );//右子树
28     }
29 }
30
31 int main()
32 {
33     int n;
34     while( cin >> n )
35     {
36         flag = true;
37         for( int i = 0 ; i<n ; i++ )
38             cin >> in[i];
39         for( int i = 0 ; i<n ; i++ )
40             cin >> post[i];
41         solve( in , post , n );
42         cout << endl;
43     }
44     return 0;
45 }
46 /*
47 9
48 4 7 2 1 8 5 9 3 6
49 7 4 2 8 9 5 6 3 1
50
51 1 2 4 7 3 5 8 9 6
52 */

时间: 2024-10-25 12:18:14

hdu--1710--二叉树的各种遍历间的联系的相关文章

HDU 1710 二叉树三种遍历

Binary Tree Traversals Problem Description A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjoint binary trees called the left and right subtrees. There are three most important ways in which the verti

HDU 1710 二叉树遍历,输入前、中序求后序

1.HDU  1710  Binary Tree Traversals 2.链接:http://acm.hust.edu.cn/vjudge/problem/33792 3.总结:记录下根结点,再拆分左右子树,一直搜下去.感觉像dfs. 题意:二叉树,输入前.中序求后序. (1)建立出一颗二叉树,更直观.但那些指针用法并不是很懂. #include<iostream> #include<cstdio> #include<cstdlib> using namespace

hdu 1710 二叉树的遍历

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1710 大意:给出一个二叉树的前序和中序,求其后序遍历 ps:1.在写链表时,需要写明typedef struct node{};即声明一个指向自己的数据类型,而不是直接写struct node{} 2.采用分治的思想,把一颗二叉树分解成n棵二叉树,每棵都有其对应的根节点,利用这点进行遍历 3.malloc在#include<stdlib.h>头文件中 4.这是自己第一次写数据结构树型题目,所以代码是借

HDU 1710 二叉树的遍历 Binary Tree Traversals

Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4330    Accepted Submission(s): 1970 Problem Description A binary tree is a finite set of vertices that is either empty or

HDU 1710 二叉树遍历

首先.先序遍历是先访问根节点.然后左节点 然后右节点.从根节点开始 直到它的子节点没有左节点才开始回溯访问上一个节点的右节点.同理.中序遍历 先访问左节点 然后是父节点 然后是右节点.从根节点开始 直到它的孩子节点没有左节点 才开始回溯访问该节点 然后是它的父节点 然后是它的兄弟右节点.也就是说 每次访问一个节点时 它的左节点已经被访问过了.访问过之后 就要访问它的 右节点.(有点醉T_T.......)后续遍历.从根节点开始 直到叶子节点.先访问左节点 然后是右节点.然后回溯访问父节点.注意回

【二叉树】hdu 1710 Binary Tree Traversals

acm.hdu.edu.cn/showproblem.php?pid=1710 [题意] 给定一棵二叉树的前序遍历和中序遍历,输出后序遍历 [思路] 根据前序遍历和中序遍历递归建树,再后续遍历输出 malloc申请空间在堆,函数返回,内存不释放,需要free手动释放 [Accepted] #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<alg

HDU 1710 Binary Tree Traversals(二叉树)

题目地址:HDU 1710 已知二叉树先序和中序求后序. #include <stdio.h> #include <string.h> int a[1001], cnt; typedef struct node { int date ; node *lchild , *rchild ; }*tree; int getk(int ch,int ino[],int is,int n) { for(int i = is ; i <= is + n -1 ; i++) if(ino[

数据结构 - 二叉树(重构 + 遍历)

写在前面 昨天有同学问到我一题关于重构二叉树的问题(link),做了一下,也做个记录吧! 所谓二叉树的重构,就是给你前序和中序,或者中序和后序,让你还原这棵二叉树. 注意:给出前序和后序是不能唯一确定一棵二叉树的,证明请看这儿. 一.给出前序和中序,重构二叉树 一个递归的过程: 当前结点的value:每一轮根据前序的第一个元素确定当前结点值. 左子树的中序遍历数组:以当前结点的value为分界点,将中序分为左部分和右部分,左部分即为左子树的中序遍历数组. 右子树的中序遍历数组:以当前结点的val

LeetCode 145 Binary Tree Postorder Traversal(二叉树的后续遍历)+(二叉树、迭代)

翻译 给定一个二叉树,返回其后续遍历的节点的值. 例如: 给定二叉树为 {1, #, 2, 3} 1 2 / 3 返回 [3, 2, 1] 备注:用递归是微不足道的,你可以用迭代来完成它吗? 原文 Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recur

3143 二叉树的序遍历——http://codevs.cn/problem/3143/

第一部分:题目 题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号. 输出描述 Output Description 输出一共三行,分别为前序遍历,中序遍历和后序遍历.编号之间用空格隔开. 样例输入 Sample Input 5 2 3 4 5 0 0 0 0 0 0 样例输出 Sam