一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”:
例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示。你的任务是要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿色或蓝色。并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。
输入数据由多组数据组成。
每组数据仅有一行,不超过10000个字符,表示一个二叉树序列。
对于每组输入数据,输出仅一行包含两个整数,依次表示最多和最少有多少个点能够被染成绿色。
基本想法:对于root节点的每种染色方法,分别处理左右子树。
对于左右子树,问题变为规模更小的同类问题。
递归即得
class Node: def __init__(self,color=0,left=None,right=None): self.color=color self.left=left self.right=right class Tree: def __init__(self,root=None): self.root=root a=[1,1,2,2,0,0,2,0,1,0] t=Tree() t.root=Node() stack=[t.root] while len(a): n=a.pop(0) if n==2: p=stack.pop() p.left=Node() p.right=Node() stack.append(p.right) stack.append(p.left) elif n==1: p=stack.pop() p.left=Node() stack.append(p.left) else: stack.pop() def ColorTree_Max(root_c,root): if root is None: return 0 Max=0 root.color=root_c if root_c==1: Max+=1 Max+=max(ColorTree_Max(2,root.left)+ColorTree_Max(3,root.right), ColorTree_Max(3,root.left)+ColorTree_Max(2,root.right)) return Max elif root_c==2: Max+=max(ColorTree_Max(1,root.left)+ColorTree_Max(3,root.right), ColorTree_Max(3,root.left)+ColorTree_Max(1,root.right)) return Max else: Max+=max(ColorTree_Max(1,root.left)+ColorTree_Max(2,root.right), ColorTree_Max(2,root.left)+ColorTree_Max(1,root.right)) return Max def ColorTree_Min(root_c,root): if root is None: return 0 Min=0 root.color=root_c if root_c==1: Min+=1 Min+=min(ColorTree_Min(2,root.left)+ColorTree_Min(3,root.right), ColorTree_Min(3,root.left)+ColorTree_Min(2,root.right)) return Min elif root_c==2: Min+=min(ColorTree_Min(1,root.left)+ColorTree_Min(3,root.right), ColorTree_Min(3,root.left)+ColorTree_Min(1,root.right)) return Min else: Min+=min(ColorTree_Min(1,root.left)+ColorTree_Min(2,root.right), ColorTree_Min(2,root.left)+ColorTree_Min(1,root.right)) return Min print max(ColorTree_Max(1,t.root),ColorTree_Max(2,t.root),ColorTree_Max(3,t.root)) print min(ColorTree_Min(1,t.root),ColorTree_Min(2,t.root),ColorTree_Min(3,t.root))
发表评论
-
小算法题--7 勇气的挑战
2012-03-27 21:08 1155Problem 给定n个点的坐标(x,y,z),且n< ... -
小算法题--7 技能树升级
2012-03-23 17:50 0技能树 Problem 玩过Diablo的人对技能树 ... -
小算法题--6 字符串的距离
2012-03-23 10:52 807Problem 设有字符串X,我们称在X的头尾及中间插入任意 ... -
小算法题--4
2012-03-21 17:17 747#在黑板上写了N个正整数组成的一个数列,进行如下操作: 每次擦 ... -
每天一个算法--4
2012-03-20 18:56 0# 题目:用1、2、2、3、4、5这六个数字,打印出所有不同的 ... -
小算法题--3
2012-03-19 17:35 728题目描述:一个正整数有可能可以被表示为 n(n> ... -
百度之星赛题
2012-03-19 17:39 14202005年百度之星程序设计大赛试题初赛题目 第一 ... -
每天一个算法--3 剪刀石头布
2012-03-19 15:37 0题目: 剪刀石头布 N个小孩正在和你玩一种剪刀石头布游戏( ... -
小算法题--2
2012-03-15 17:09 678题目:输入一个整数数组,调整数组中数字的顺序,使得所有偶数位于 ... -
微软等数据结构+算法面试100题全部答案完整亮相
2012-03-15 10:15 0本文转载自CSDN大牛的一篇博客:http://blo ... -
小算法题--1
2012-03-15 09:44 688输入两个整数n 和m,从数列1,2,3.......n 中随意 ...
相关推荐
三色二叉树是一种特殊的二叉树数据结构,它的每个节点可以有三种颜色:红色、蓝色或绿色。这种数据结构在解决某些特定问题时非常有用,例如在图形着色问题或者算法设计中作为辅助结构。在给定的场景中,我们讨论的是...
在【需求分析】部分,原题给出了二叉树序列的表示方法,即用0、1、2表示空节点、左子树和右子树。实验的目标是,给定一个二叉树序列,找出可以染成绿色的节点数量的最大值和最小值。 在【概要设计】中,定义了一个...
算法笔记_面试题_5.二进制/位运算相关 本篇笔记主要介绍了二进制/位运算相关问题的解决方法,包括问题分析、解决方法等。这个问题是算法面试题中的一道常见题目,开发者需要掌握这个问题的解决方法。 算法笔记_...
结构化排列涉及数据结构中元素的顺序变化,如二叉树的不同遍历方法,对于算法设计和软件开发都很重要。 #### 排序算法 介绍了从基础到高级的各种排序算法,包括插入排序、选择排序、气泡排序、快速排序、合并排序等...
“第2篇算法基本应用篇”详细讲解了算法在排序、查找、数值计算、数论、经典趣题和游戏中的应用;“第3篇算法高级应用篇”讲解了算法的一些高级应用技术,包括在密码学和数据压缩/解压缩中的应用。 《C/C++常用算法...
1. **汉诺塔(Hanoi Tower)**:这是一个递归算法问题,目标是将一个柱子上的所有圆盘移动到另一个柱子上,遵循每次只能移动一个圆盘且大盘子不能在小盘子之上的规则。 2. **斐波那契数列(Fibonacci Sequence)**:...
第5章 数学趣题(一) 5.1 舍罕王的失算 5.2 求两个数的最大公约数和最小公倍数 5.3 歌德巴赫猜想的近似证明 5.4 三色球问题 5.5 百钱买百鸡问题 5.6 判断回文数字 5.7 填数字游戏求解 5.8 新郎和新娘 5.9 爱因斯坦...
标题《C语言实现一些经典算法,可以免费下载》和描述《参加比赛后第一次知道算法这么重要,在网上找过很多算法的资料,这个资料对我最有帮助》表明了本资料是关于使用C语言实现各类经典算法,并且可以免费获取的电子...
5. **迷宫问题**:迷宫求解是图论和搜索算法的经典应用。可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来寻找从起点到终点的路径。理解这些搜索算法的工作原理,以及如何有效地表示和操作迷宫数据结构,是解决...
Josephu问题 编写算法,对N个关键字取整数值的记录进行整理, 使所有关键字为负值的记录排在关键字为非负数的记录之前. 多项式相加 二叉树排序 冒泡 递归 非递归算法 折半查找算法
061 二叉树遍利 062 浮点数转换为字符串 063 汉诺塔问题 064 哈夫曼编码 065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译...
在内存管理部分,讲解了Go的垃圾回收器的工作原理,如三色标记算法,并讨论了使用`unsafe`包的情况。此外,还介绍了如何在Go中调用C代码,以及`defer`、`panic`和`recover`这三个关键的控制流关键字。 接着,书中...