LeetCode:特定深度节点链表

前言:

         “特定深度节点链表”的题目是在力扣题库上的程序员面试经典(第6版)中。我是使用Python3编写的解法,性能算不上好,在此仅仅只是阐述一下解法编程思想。仅供参考~

        解法上可能会跟别人相同,所以要是看不懂下面的阐述的话可以去力扣对应的题目上查看其他人的解题思路~

问题描述:

        题目的要求是:给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。

力扣的演示例子如下:

输入:[1,2,3,4,5,null,7,8]

        1
       /  \ 
      2    3
     / \    \ 
    4   5    7
   /
  8

输出:[[1],[2,3],[4,5,7],[8]]

解题思路:

        采用递归的方法,对树进行先序遍历(根左右)。每到一个深度时,就将该节点传入列表中。如果树为空时,则无需使用递归,直接返回一个空列表即可。

相关代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def listOfDepth(self, tree: TreeNode) -> List[ListNode]:
        # 采用先序遍历的方式,遍历树(根左右)
        def getList(tree,index,node_list):
            # index表示当前结点的深度,从0开始
            # node_list的下标与index相同,即根节点在列表的第一个位置
            # 将当前的结点保存至列表中
            if tree.val is not None:
                node=ListNode()
                node.val=tree.val
                if index>=len(node_list):
                    # 当前列表没有该深度的结点时,将此结点插入列表中
                    node_list.append(node)
                else:
                    # 当前列表有该深度的结点时,将此结点插入尾部
                    n1=node_list[index]
                    # 找到结点的尾部
                    while n1.next is not None:
                        n1=n1.next
                    # 将当前结点插入尾部
                    n1.next=node
            # 遍历存在的左子树
            if tree.left is not None:
                getList(tree.left,index+1,node_list) 
            # 遍历右子树
            if tree.right is not None:
                getList(tree.right,index+1,node_list)
        node_list=[]
        # 判断树是否为空,若为空则无需调用getList
        if tree is not None:
            getList(tree,0,node_list)
        return node_list

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值