二叉树的递归遍历 Tree UVa548

题意:给一棵点带权的二叉树的中序和后序遍历,找一个叶子使得他到根的路径上的权值的和最小,如果多解,那该叶子本身的权值应该最小

解题思路:1.用getline()输入整行字符,然后用stringstream获得字符串中的数字                                                              2.用数组in_oder[]和post_order[]分别表示中序遍历和后序遍历的顺序,用数组rch[]和lch[]分别表示结点的左子树和右子树                                            3.用递归的办法根据遍历的结果还原二叉树(后序遍历的最后一个树表示的是根节点,中序遍历的中间一个表示根节点)                                             4.二叉树构造完成后,再执行一次递归遍历找出最优解

代码如下:

 1 #include<stdio.h>       //用数组存储二叉树
 2 #include<string>
 3 #include<sstream>
 4 #include<iostream>
 5 using namespace std;
 6 const int MAXX=10100;
 7 int in_order[MAXX],post_order[MAXX],lch[MAXX],rch[MAXX];
 8 int n;
 9
10 bool read_list(int *a){
11     string line ;
12     if(!getline(cin,line)) return false;
13     stringstream ss(line);
14     n=0;
15     int x;
16     while(ss>>x) a[n++]=x;
17     return n>0;
18 }
19
20 //把in_order[L1...R1]和post_order[L2...R2]建成一棵树,返回树根
21 //递归建立二叉树,数组存储左右结点
22 int build(int L1,int R1,int L2,int R2){
23     if(L1>R1) return 0;
24     int root=post_order[R2];
25     int p=L1;
26     while(in_order[p]!=root)p++;
27     int cnt=p-L1;//左子树的结点树
28     lch[root]=build(L1,p-1,L2,L2+cnt-1);
29     rch[root]=build(p+1,R1,L2+cnt,R2-1);
30     return root;
31 }
32
33 int best,best_sum;//目前对应的最优解和权值的和
34
35 void dfs(int u,int sum){
36     sum=sum+u;
37     if(!lch[u]&&!rch[u]){
38         if(sum<best_sum||(sum==best_sum&&u<best)){
39             best=u;
40             best_sum=sum;
41         }
42     }
43     if(lch[u]) dfs(lch[u],sum);
44     if(rch[u]) dfs(rch[u],sum);
45 }
46
47 int main(){
48     freopen("in.txt","r",stdin);
49     while(read_list(in_order)){
50         read_list(post_order);
51         build(0,n-1,0,n-1);
52         best_sum=1e9;
53         dfs(post_order[n-1],0);
54         printf("%d\n",best);
55     }
56 }

此题中二叉树的应用,比如用中序遍历和后序遍历构造出原来的二叉树,还有递归的遍历二叉树,以没有子树为递归跳出的条件

时间: 2024-10-18 20:18:53

二叉树的递归遍历 Tree UVa548的相关文章

UVa 548 (二叉树的递归遍历) Tree

题意: 给出一棵由中序遍历和后序遍历确定的点带权的二叉树.然后找出一个根节点到叶子节点权值之和最小(如果相等选叶子节点权值最小的),输出最佳方案的叶子节点的权值. 二叉树有三种递归的遍历方式: 先序遍历,先父节点  然后左孩子  最后右孩子 中序遍历,先左孩子  然后父节点  最后父节点 后序遍历,先左孩子  然后右孩子  最后父节点 这里有更详细的解释: http://blog.csdn.net/sicofield/article/details/9066987 紫书上面写错了,后序遍历最后一

辛星算法教程第一节即二叉树的递归遍历

我们都知道,二叉树的递归遍历可以分为三种:前序遍历.中序遍历和后序遍历,其实这三种遍历方式大同小异,由于都是使用递归实现的,因此也比较简单. 首先是tree.h文件,代码如下: #ifndef TREE_H #define TREE_H #include <stdio.h> #include <malloc.h> #include <assert.h> typedef int ElemType; typedef struct Btree { ElemType val;

二叉树的递归遍历

#include<iostream> #include<stack> using namespace std; /*二叉树的前序遍历,按照 根节点->左孩子->右孩子 */ typedef struct node { char data; struct node *lchild,*rchild; }BinTree; void creatBinTree(BinTree * &root){ char ch; if(ch=getchar()){ if(ch=='#')

二叉树的递归遍历和非递归遍历(附详细例子)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

2、二叉树:递归遍历

对二叉树而言,最为核心的操作就是遍历.遍历可以用递归的方式,也可以用循环的方式. 就递归遍历而言,又有“先序.中序.后续”三种不同的遍历顺序.通过下面的一个示意图可以从感官上来体会一下三种不同的遍历顺序: 为了学习二叉树的相关算法,首先需要构建一个二叉树的抽象类public abstract class BiTreeAbstract<T> ,该类中有一个表示结点的内部类Node,将结点的数据类型定义为泛型T以方便将其用于不同的数据类型. 1 package com.magicode.datas

数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)

Nonrecursive Traversal of Binary Tree First I wanna talk about why should we use <code>Stack</code> to implement this algorithm. I think it is due to the FILO feature of Stack, and that really matters and makes sense when you get around with t

二叉树的递归遍历 The Falling Leaves UVa 699

题意:对于每一棵树,每一个结点都有它的水平位置,左子结点在根节点的水平位置-1,右子节点在根节点的位置+1,从左至右输出每个水平位置的节点之和 解题思路:由于上题所示的遍历方式如同二叉树的前序遍历,与天平那题不同,本题不需要构造出完整的结点左右子树,只需要构造出结点的相对位置,每次输入一个结点树,若为-1,则返回,否则依次递归执行input(p-1)与input(p+1). 代码如下: 1 #include<stdio.h> 2 #include<cstring> 3 #inclu

【数据结构基础复习】二叉树的递归遍历(一)

一.绪论 今天来点简单的,好久没有写过代码了,基础知识都快忘了,从今天开始还是得简简单单的写一些,作为复习吧,不能光搞研究,代码给拉下了. 二.目的 复习二叉树的遍历 二叉树的遍历有三种,前中后.这里的前中后是根据树的根节点来看的,前序就是,根节点---左子节点---右子节点.其余类同.其实递归遍历没什么好谢的,都是教材上有的,这里直接把代码贴出来,不做过多的累述. //前序遍历: public void preOderRecur( Node root ){ if(root == null){

java 二叉树 深度优先递归遍历

深度优先遍历二叉树. 1. 中序遍历的递归算法: 若二叉树为空,则算法结束:否则: 中序遍历根结点的左子树: 访问根结点: 中序遍历根结点的右子树. 2. 前序遍历的递归算法: 若二叉树为空,则算法结束,否则: 访问根结点: 前序遍历根结点的左子树: 前序遍历根结点的右子树. 3. 后序遍历的递归算法: 若二叉树为空,则算法结束,否则: 后序遍历根结点的左子树: 后序遍历根结点的右子树: 访问根结点. package com.test6; /**  * 二叉树  *   * 描述: 1.二叉树的