携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 树中节点数在范围
[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 提交记录如下:
- 时间复杂度:O(height×2height),height是二叉树的高度
- 空间复杂度:O(height),height是二叉树的高度
以上是本期内容,欢迎大佬们点赞评论,下期见~~~