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

题意:对于每一棵树,每一个结点都有它的水平位置,左子结点在根节点的水平位置-1,右子节点在根节点的位置+1,从左至右输出每个水平位置的节点之和

解题思路:由于上题所示的遍历方式如同二叉树的前序遍历,与天平那题不同,本题不需要构造出完整的结点左右子树,只需要构造出结点的相对位置,每次输入一个结点树,若为-1,则返回,否则依次递归执行input(p-1)与input(p+1)。

代码如下:

 1 #include<stdio.h>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 const int MAXX=260000;
 6 int sum[MAXX];
 7 void input(int p){
 8     int root;
 9     scanf("%d",&root);
10     if(root==-1)  return;
11     sum[p]+=root;
12     input(p-1);
13     input(p+1);
14 }
15
16 bool init(){
17     int root;
18     scanf("%d",&root);
19     if(root==-1)    return false;
20     int d;
21     memset(sum,0,sizeof(sum));
22     d=MAXX/2;
23     sum[d]=root;
24     input(d-1);
25     input(d+1);
26 }
27
28 int main(){
29     freopen("in.txt","r",stdin);
30     int i=1;
31     while(init()){
32         printf("Case %d:\n",i);
33         int num=0;
34         while(sum[num]==0){
35             num++;
36         }
37         while(sum[num]!=0){
38             printf("%d%c",sum[num],sum[num+1]?‘ ‘:‘\n\n ‘);
39             num++;
40         }
41         cout<<endl;
42         i++;
43     }
44 }
时间: 2024-10-06 00:16:06

二叉树的递归遍历 The Falling Leaves UVa 699的相关文章

【紫书】 The Falling Leaves UVA - 699 递归得简单

题意:给你一颗二叉树的前序遍历,空子树以-1表示,将左右子树的权值投影到一维数轴上,左儿子位置为根位置-1,右儿子+1求个个整点上的和: 题解:递归,整个过程只需维护一个sum数组. 更新根,更新leftson ,更新rightson; 代码: #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include<stdio.h> #include<algorithm> #include<string>

The Falling Leaves UVA 699

说说: 这道题非常简单,本质上就是二叉树的先序遍历.只需要建立一个数组,然后将初始位置放在数组中心.然后进入左子树的根节点,向数组左侧移动一位,添加当前节点所含的值,同理进入右子树的根节点,向数组右侧移动一位,添加当前节点所含的值.并标记好到达过的数组的左右边界,最后将边界内数组的值输出即可. 源代码: #include <stdio.h> #include <string.h> #define MAXN 200 int piles[MAXN]; int leftmost,righ

下落的树叶 (The Falling Leaves UVA - 699)

题目描述: 原题:https://vjudge.net/problem/UVA-699 题目思路: 1.依旧二叉树的DFS 2.建树过程中开个数组统计 //紫书源代码WA AC代码: 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 const int maxn = 100 ; 6 int sum[maxn] ; 7 8 void buildtree(int val,int p) //建树,p

二叉树的递归遍历

#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

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

我们都知道,二叉树的递归遍历可以分为三种:前序遍历.中序遍历和后序遍历,其实这三种遍历方式大同小异,由于都是使用递归实现的,因此也比较简单. 首先是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;

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

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

二叉树的递归遍历 Tree UVa548

题意:给一棵点带权的二叉树的中序和后序遍历,找一个叶子使得他到根的路径上的权值的和最小,如果多解,那该叶子本身的权值应该最小 解题思路:1.用getline()输入整行字符,然后用stringstream获得字符串中的数字 2.用数组in_oder[]和post_order[]分别表示中序遍历和后序遍历的顺序,用数组rch[]和lch[]分别表示结点的左子树和右子树 3.用递归的办法根据遍历的结果还原二叉树(后序遍历的最后一个树表示的是根节点,中序遍历的中间一个表示根节点) 4.二叉树构造完成后

2、二叉树:递归遍历

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