题目描述:
小彭游览哈尔滨某游乐园。在该游乐园中,各娱乐设施的位置构成一棵二叉树的结构。
该二叉树的节点从1到n编号。1号节点是根节点,也是游乐园的入口,其他每个节点都是一个娱乐设施。二叉树的每一条边代表连接两个设施的路。二叉树的每一个叶子节点都有一个出口可以离开游乐园。二叉树中的每个节点都保存一个正整数,根节点保存的值是游乐园门票,其他节点中保存的值是游玩该设施的花费。
小彭不愿意走回头路,他希望从入口进入,沿一条路径从一个出口离开,并游玩该路径经过的所有娱乐设施。小彭总共带了k元钱,他想尽可能多花点。请你帮他找一条在不超过k元的前提下,消费尽可能多的路径。
输入格式:
第一行输入2个正整数n(n<=1,000,000),k(k<=100,000,000),分别表示二叉树中节点的个数和小彭带的钱数。
第二行输入n个整数,其中第i个整数表示编号为i的节点的左儿子的编号。0表示左儿子不存在。
第三行输入n个整数,其中第i个整数表示编号为i的节点的右儿子的编号。0表示右儿子不存在。
第四行输入n个非负整数,其中第i个整数表示编号为i个节点对应设施的消费。
输出格式:
第一行输出一个整数,表示花费的总金额。
第二行输出若干整数,表示游玩的设施编号,按从根节点到叶子节点的顺序排列。若存在多条花费相同的路径,则将每条路径都打印出来。路径按照字典序排列,每条路径占一行。
样例输入:
6 12
2 4 0 0 0 0
3 5 6 0 0 0
5 4 8 5 3 0
(如下图所示)
样例输出:
12
1 2 5
我的思路:
构造的二叉树结点含有父结点的指针,这样从每一个叶子结点向上进行路径的搜索,得到的路径都是唯一的。
因此,我的预设步骤:
(1)先使用先序遍历寻找出二叉树的叶子结点。
(2)对于叶子结点向上搜索遍历,找到每个叶子结点对应的路径的钱数。
(3)通过对比所有的钱数,找到在K以内的钱数最多的路径。
(4)找出该钱数的所有路径并且输出。(如果有符合条件的钱数的话)
整体构造:
构造函数create用来根据输入创建一个二叉树
构造函数trav先序遍历到叶子结点,在此时函数内部调用向上进行遍历的函数uptrav,由此得到该叶子结点的路径,通过叠加得到该路径所需花费的金钱,将叶子结点的指针以及该路径的钱数保存在我所创建的一个结构体数组里面。
处理该结构体数组,得到K以内最大的钱数作为所要的路径,打印出来。
(⚠⚠:实际实现十分困难,我并没有完成这个)