【leetcode系列】对二叉树的各个节点进行标记

对二叉树的各个节点进行标记

1、题目背景描述

(二叉树 )给定一个二叉树的表格,包含两列:Node 和 Parent,Node表示二叉树的节点值,Parent是Node的父节点。表名为BST:
Column  Type
Node  Integer
Parent  Integer
我们希望能找到二叉树每个节点类型,并按照大小排序。按如下方式输出结果:
当节点是二叉树的根节点,输出Root
当节点是叶子节点时,输出Leaf
当节点两者都不是时,输出Inner
输入样例
Node  Parent
1  2
3  2
6  8
9  8
2  5
8  5
5  null
输出样例
1 Leaf
2 Inner
3 Leaf
5 Root
6 Leaf
8 Inner
9 Leaf
二叉树样例:
     5
  2    8
1  3  6  9

2、废话不说,直接上代码:

print '''题目需求:
    当节点是二叉树的根节点,输出Root
    当节点是叶子节点时,输出Leaf
    当节点两者都不是时,输出Inner
'''


def func_sign(in_map, in_list):
    next_level = []
    res_list = []
    for e in in_list:
        if e in in_map:
            res_list.append((e, 'Inner'))
            next_level = next_level+in_map[e]
        else:
            res_list.append((e, 'Leaf'))
    return next_level, res_list


def fun_main(origin_data_list):
    print "origin_data_list:", origin_data_list
    print "step1、将list转换成dict"
    xx_map = {}
    for e in origin_data_list:
        # print e
        if e[1] not in xx_map:
            xx_map[e[1]] = []
        xx_map[e[1]].append(e[0])
    print "origin_data_dict:", xx_map
    print "step2、找到根节点"
    final_res_list = [(xx_map[-1][0], "Root")]
    # print xx_map[-1][0],"Root"
    tmp_list=xx_map[xx_map[-1][0]]
    # print "tmp_list: ",tmp_list
    print "step3、从根节点出发,循环遍历各层级,标记各层级的节点,标记为 叶子节点,中间节点还是根节点"
    while True:
        if len(tmp_list) == 0:
            break
        tmp_list, res_list = func_sign(in_list=tmp_list, in_map=xx_map)
        final_res_list = final_res_list+res_list
    # print final_res_list
    print "step4、按照节点值排升序,然后输出"
    result_list = sorted(final_res_list, key=lambda line: line[0])
    print "step5、输出标记结果:"
    for e in result_list:
        print e[0], e[1]


if __name__ == '__main__':
    origin_data_list = [[1, 2], [3, 2], [6, 8], [9, 8], [2, 5], [8, 5], [5, -1]]
    fun_main(origin_data_list)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值