【算法练习】树的遍历与合并排序数组

目录

codewars

题目(难度:4K)

题目详解(中文)

个人思路 

先序遍历

中序遍历

后序遍历

Leetcode

题目(难度:简单)

个人思路

扫描二维码关注公众号,回复: 11068997 查看本文章

运行效果 

大神代码


codewars

题目(难度:4K)

You are given a binary tree:

class Node:
    def __init__(self, L, R, n):
        self.left = L
        self.right = R
        self.value = n

Your task is to return the list with elements from tree sorted by levels, which means the root element goes first, then root children (from left to right) are second and third, and so on.

Return empty list if root is None.

Example 1 - following tree:

                 2
            8        9
          1  3     4   5

Should return following list:

[2,8,9,1,3,4,5]

Example 2 - following tree:

                 1
            8        4
              3        5
                         7

Should return following list:

[1,8,4,3,5,7]

题目详解(中文)

您将得到一棵二叉树:

class Node:
    def __init__(self, L, R, n):
        self.left = L
        self.right = R
        self.value = n
您的任务是返回带有树的元素(按级别排序)的列表,这意味着根元素排在第一位,然后根子级(从左到右)排在第二和第三位,依此类推。

如果root为,则返回空列表None。

示例1-以下树:

                 2
            8        9
          1  3     4   5
应该返回以下列表:

[2,8,9,1,3,4,5]
示例2-以下树:

                 1
            8        4
              3        5
                         7
应该返回以下列表:

[1,8,4,3,5,7]
 

个人思路 

  • 一眼看去发现这是二叉树的层次遍历,一层一层下去,将每层的元素添加进列表
  • 先将参数整体加入队列queue,第一遍遍历,拿出第一个元素,此时队列只有一个元素,就是树的根,我们将它的value加入新的列表,然后判断它的左右枝,如果有元素,将其加入queue,然后再进行queue遍历,第二遍queue有两个元素了,依次进行上一步,最后返回它的层次列表
  • 复习一下树的遍历:先:根左右,中:左根右,后:左右根
def tree_by_levels(node):
    queue = [node]
    res = []
    if node==None:
        return []
    while queue:
        lens =len(queue)
        for i in range(lens):                
            temp = queue.pop(0)
            res.append(temp.value)
            if temp.left:
                queue.append(temp.left)
            if temp.right:
                queue.append(temp.right)
    return res

先序遍历

def tree_by_levels(node):
    if node.value:
        print(node.value)
    if node.left:
        tree_by_levels(node.left)
    if node.right:
        tree_by_levels(node.right)

中序遍历

def tree_by_levels(node):
    if node.left:
        tree_by_levels(node.left)
    if node.value:
        print(node.value)
    if node.right:
        tree_by_levels(node.right)
    

后序遍历

def tree_by_levels(node):
    if node.left:
        tree_by_levels(node.left)
    if node.right:
        tree_by_levels(node.right)
    if node.value:
        print(node.value)

Leetcode

题目(难度:简单)

给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。

初始化 A 和 B 的元素数量分别为 m 和 n。

示例:

输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

个人思路

  • 一开始想用切片掉[0,0,0]然后再直接A+B再排序,后面发现切片并不是原地操作,意思是它是开辟新的地址,而题目要求A列表原地操作,所以放弃了这一想法
  • 想了一会就想直接赋值试试,把A中预存的位置都替换成B,再排序一下,完美运行,只不过调用了排序这个库函数,有点无奈
    class Solution:
        def merge(self, A: List[int], m: int, B: List[int], n: int) -> None:
            j=0
            for i in range(n+m):
                if i>=m:
                    A[i]=B[j]
                    j+=1
            A.sort()
            """
            Do not return anything, modify A in-place instead.
            """

运行效果 

大神代码

发布了41 篇原创文章 · 获赞 27 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Cxk___/article/details/104609396
今日推荐