洛谷 1305——新二叉树

本文介绍了一个简单的算法,用于输入一串完全二叉树,并通过前序遍历的方式输出该二叉树。首先读取二叉树的节点数,接着逐个节点输入并构造二叉树结构,最后通过递归方式实现前序遍历。

题目描述

输入一串完全二叉树,用遍历前序打出。

输入输出格式

输入格式:
第一行为二叉树的节点数n。

后面n行,每一个字母为节点,后两个字母分别为其左右儿子。

空节点用*表示

输出格式:
前序排列的完全二叉树

输入输出样例

输入样例#1:
6
abc
bdi
cj*
d**
i**
j**
输出样例#1:
abdicj


先造树,然后求一下前序遍历就行了


代码如下:

var a:array['a'..'z',1..2] of char;
    i,n:longint;
    h,x,y,root:char;

procedure dfs1(c:char);
begin
  write(c);
  if a[c,1]<>'*' then dfs1(a[c,1]);
  if a[c,2]<>'*' then dfs1(a[c,2]);
end;
begin
  readln(n);
  for i:=1 to n do
  begin
    readln(h,x,y);
    if i=1 then root:=h;
    a[h,1]:=x;
    a[h,2]:=y;
  end;
  dfs1(root); writeln;
end.
### 关于洛谷最小函数值题目的解题思路 此问题的核心在于如何高效找到由 $ n $ 个二次函数组成的集合中的前 $ m $ 小的函数值。以下是详细的分析和解决方案。 #### 使用优先队列(堆) 为了快速获取当前所有可能取值中的最小值,可以利用 **优先队列** 或者称为 **二叉堆** 的数据结构来实现动态维护候选值的功能[^1]。具体来说: - 初始状态下,对于每一个函数 $ f_i(x) = a_ix^2 + b_ix + c_i $ ,令其初始输入变量 $ x=1 $ 并计算对应的函数值。 - 这些初始值被存入一个支持按大小排序的数据结构——即优先队列中。由于我们需要的是从小到大的顺序,因此应构建一个小顶堆。 - 接下来执行 $ m $ 轮循环,在每一轮中完成两项任务: - 取出堆顶元素作为当前全局最小值; - 对该最小值所关联的那个特定函数而言,将其参数 $ x $ 增加一单位长度再重代回原方程得到的数值,并把产生的这个数值再次加入至堆当中以便后续比较使用[^3]。 通过上述方法能够保证每一次都能够选取到尚未处理过的最小可用选项直到满足所需数量为止。 #### 时间复杂度分析 整个算法主要分为两个部分考虑时间消耗情况: 1. 初始化阶段:将所有的起始点放入堆内的过程耗时为 \(O(n \cdot logn)\),因为最多会有\(n\)次插入动作发生而单次插入平均成本大约等于\(\log{n}\). 2. 主体迭代环:总共进行了$ m $步操作;其中每一步都涉及到了一次删除以及若干次点的动作。假设最坏情况下每次都需要调整整棵完全二叉树,则整体开销约为\(O(m \cdot logn)\). 综上所述总的时间复杂度近似为\(O((m+n)*logn)\)[^3]. ```python import heapq def find_min_function_values(ai, bi, ci, m): heap = [] # Initialize the heap with first values of each function. for idx in range(len(ai)): value = ai[idx]*1*1 + bi[idx]*1 + ci[idx] entry = (value, idx, 1) # Store tuple as (function_value, index_of_func, current_x) heapq.heappush(heap, entry) result = [] while len(result)<m and heap: val,idx,x = heapq.heappop(heap) result.append(val) next_val = ai[idx]*(x+1)**2 + bi[idx]*(x+1) + ci[idx] new_entry=(next_val,idx,x+1) heapq.heappush(heap,new_entry) return result[:m] # Example usage: ai=[1,-2,3];bi=[4,-5,6];ci=[7,8,9]; print(find_min_function_values(ai, bi, ci, 5)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值