【LeetCode】655. 输出二叉树

75 阅读3分钟

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 树中节点数在范围 [1, 210] 内
    • -99 <= Node.val <= 99
    • 树的深度在范围 [1, 10] 内

二、思路分析:

我们拿到本题,读取题目要求对二叉树转换在m*n的矩阵中,那么对于二叉树中每一个节点值怎么存储,我们继续审题确认存储的规律:

  • 二叉树root高度为height,那么ans矩阵行m为height+1
  • 矩阵列n值为2 ** m - 1
  • 二叉树root的根root存储ans[0][c],其中c为(n-1)//2
  • 二叉树的root的左子节点存储在ans[s+1][c-2**(height-s-1)]
  • 二叉树的root的右子节点存储在ans[s+1][c+2**(height-s-1)]

根据题目内容,结合二叉树遍历方式,我们可以使用深度遍历的方式模拟求解,思路如下:

  • 首先题目只给二叉树root参数,我们需要深度遍历来求二叉树的高度,则定义一个局部方法getheight(root)
    • 因为需要求到二叉树的高度,l变量赋值getheight(root.left),r变量赋值getheight(root.right),返回在l和r之间取最大值后+1
    • 直到root二叉树遍历完成,返回getheight(root)-1 并赋值为height
  • 二叉树root的高度为height后,ans的矩阵行m值为height+1
  • ans的矩阵列n为2 ** m -1,并初始化 ans m*n矩阵
  • 遍历二叉树继续使用深度优先遍历,因此我们再定义一个局部方法dfs()前序遍历
  • 因为二叉树每一个节点在ans矩阵中位置与行m索引和n根节点c值有关,因此dfs需要传入三个参数节点node,行的起始位置s和列的起始点
  • 按照前序遍历ans[s][c]= str(node.val)
  • 当 node的左子节点存在时,则递归dfs(root.val,s+1,c-2**(height-s-1))
  • 当 node的右子节点存在时,则递归dfs(root.val,s+1,c+2**(height-s-1)) 根据以上思路,我们使用python和递归的方法,可以快速实现,代码如下:
    class Solution(object):
        def printTree(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[str]]
            """
            def getheight(node):
                if not node:return 0
                l = getheight(node.left)
                r = getheight(node.right)
                return max(l,r)+1
    
            height = getheight(root)-1
            m = height + 1
            n = 2**m - 1
            ans = [[""] * n for _ in range(m)]
            def dfs(node,s,c):
                ans[s][c] = str(node.val)
                if node.left:
                    dfs(node.left,s+1,c-2**(height-s-1))
                if node.right:
                    dfs(node.right,s+1,c+2**(height-s-1))
            dfs(root,0,(n-1)//2)
            return ans
    

三、总结:

本题考察又是二叉树的遍历,需要根据遍历方法求出二叉树的高度,再结合height求出m*n矩阵规律将二叉树每一个节点一一存储在二维矩阵,AC 提交记录如下:

image.png

  • 时间复杂度:O(height×2height),height是二叉树的高度
  • 空间复杂度:O(height),height是二叉树的高度

以上是本期内容,欢迎大佬们点赞评论,下期见~~~