`
wzy1986714
  • 浏览: 11591 次
  • 性别: Icon_minigender_1
  • 来自: 温州
最近访客 更多访客>>
社区版块
存档分类
最新评论

小算法题--5 三色二叉树

 
阅读更多

一棵二叉树可以按照如下规则表示成一个由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))
 
0
0
分享到:
评论

相关推荐

    三色二叉树

    三色二叉树是一种特殊的二叉树数据结构,它的每个节点可以有三种颜色:红色、蓝色或绿色。这种数据结构在解决某些特定问题时非常有用,例如在图形着色问题或者算法设计中作为辅助结构。在给定的场景中,我们讨论的是...

    三色二叉树实验报告

    在【需求分析】部分,原题给出了二叉树序列的表示方法,即用0、1、2表示空节点、左子树和右子树。实验的目标是,给定一个二叉树序列,找出可以染成绿色的节点数量的最大值和最小值。 在【概要设计】中,定义了一个...

    算法面试题实用知识库分享

    算法笔记_面试题_5.二进制/位运算相关 本篇笔记主要介绍了二进制/位运算相关问题的解决方法,包括问题分析、解决方法等。这个问题是算法面试题中的一道常见题目,开发者需要掌握这个问题的解决方法。 算法笔记_...

    经典算法大全PDF

    结构化排列涉及数据结构中元素的顺序变化,如二叉树的不同遍历方法,对于算法设计和软件开发都很重要。 #### 排序算法 介绍了从基础到高级的各种排序算法,包括插入排序、选择排序、气泡排序、快速排序、合并排序等...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    “第2篇算法基本应用篇”详细讲解了算法在排序、查找、数值计算、数论、经典趣题和游戏中的应用;“第3篇算法高级应用篇”讲解了算法的一些高级应用技术,包括在密码学和数据压缩/解压缩中的应用。 《C/C++常用算法...

    经典算法(C语言)包含51个经典算法的C语言实现

    1. **汉诺塔(Hanoi Tower)**:这是一个递归算法问题,目标是将一个柱子上的所有圆盘移动到另一个柱子上,遵循每次只能移动一个圆盘且大盘子不能在小盘子之上的规则。 2. **斐波那契数列(Fibonacci Sequence)**:...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    第5章 数学趣题(一) 5.1 舍罕王的失算 5.2 求两个数的最大公约数和最小公倍数 5.3 歌德巴赫猜想的近似证明 5.4 三色球问题 5.5 百钱买百鸡问题 5.6 判断回文数字 5.7 填数字游戏求解 5.8 新郎和新娘 5.9 爱因斯坦...

    C语言实现一些经典算法,可以免费下载

    标题《C语言实现一些经典算法,可以免费下载》和描述《参加比赛后第一次知道算法这么重要,在网上找过很多算法的资料,这个资料对我最有帮助》表明了本资料是关于使用C语言实现各类经典算法,并且可以免费获取的电子...

    算法分析与设计作业

    5. **迷宫问题**:迷宫求解是图论和搜索算法的经典应用。可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来寻找从起点到终点的路径。理解这些搜索算法的工作原理,以及如何有效地表示和操作迷宫数据结构,是解决...

    数据结构课程设计报告

    Josephu问题 编写算法,对N个关键字取整数值的记录进行整理, 使所有关键字为负值的记录排在关键字为非负数的记录之前. 多项式相加 二叉树排序 冒泡 递归 非递归算法 折半查找算法

    C语言常用算法

    061 二叉树遍利 062 浮点数转换为字符串 063 汉诺塔问题 064 哈夫曼编码 065 图的深度优先遍利 066 图的广度优先遍利 067 求解最优交通路径 068 八皇后问题 069 骑士巡游 070 用栈设置密码 071 魔王语言翻译...

    MasteringGO中文版.pdf

    在内存管理部分,讲解了Go的垃圾回收器的工作原理,如三色标记算法,并讨论了使用`unsafe`包的情况。此外,还介绍了如何在Go中调用C代码,以及`defer`、`panic`和`recover`这三个关键的控制流关键字。 接着,书中...

Global site tag (gtag.js) - Google Analytics