持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 树中节点的数目在范围
[0, 100]内 -100 <= Node.val <= 100
- 树中节点的数目在范围
二、思路分析:
大伙有没有和学渣我一样,一看数据结构二叉树、链表、图,就头皮发麻。每次遇到关于二叉树的题目,总是束手无策,本期我们全面来搞懂二叉树哪些事。
-
什么是二叉树
- 树是一种非线性的数据结构,二叉树是属于树的一种。
- 二叉树需要满足两个条件:(1)本身是有序树 (2)树种包含的节点数不能超过2个,只有会出现0、1和2三种情况
- 二叉树具有三个特点
- (1)在深度为i层的二叉树,最多有2^i-1结点。
- (2)第i层,最多有2^(i-1)个结点
- (3)叶子数n0等于度数为2的结点数加1,即n0 = n2 + 1
- 二叉树可以继续分类为:满二叉树和完全二叉树。
- (1)满二叉树:除了叶子节点,其他的每个结点都2个结点
- (2)完全二叉树:满足满二叉树,且最后一层的结点依次从左到右分布
- 二叉树存储结构分为:顺序存储和链式存储
- 二叉树结点定义数据结构
-
二叉树前序遍历
- 二叉树前序遍历主要思路为:(1)访问根结点 (2)访问左子树 (3)访问右子树
-
二叉树前序遍历:递归方法
class Solution(object): def preorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ def peer(root): if not root: return res.append(root.val) peer(root.left) peer(root.right) res = [] peer(root) return res -
二叉树前序遍历:迭代法
- 使用列表stack模拟入栈,将二叉树结点临时存储起来
- 按照根->左->右的思路,将结点TreeNode.val值存入res列表中
class Solution(object): def preorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ if not root: return [] cur,res,stack = root,[],[] while stack or cur: while cur: res.append(cur.val) stack.append(cur) cur = cur.left tmp = stack.pop() cur = tmp.right return res
-
二叉树中序遍历
- 二叉树中序遍历思路:(1)访问左子树 (2)访问根结点 (3)访问右子树
-
二叉树中序遍历:递归方法
class Solution(object): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ def peer(root): if not root: return peer(root.left) res.append(root.val) peer(root.right) res = [] peer(root) return res -
二叉树中序遍历:迭代方法
-
使用列表stack模拟入栈,将二叉树结点临时存储起来
-
按照左->根->右的思路,将结点TreeNode.val值存入res列表中
class Solution(object): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] :规律:左中右 """ if not root: return cur,res,stack = root,[],[] while stack or cur: while cur: stack.append(cur) cur = cur.left tmp = stack.pop() res.append(tmp.val) cur = tmp.right return res -
-
二叉树后序遍历
- 二叉树后序遍历思路:(1)访问左子树 (2)访问右子树 (3)访问根结点
-
二叉树后序遍历:递归方法
class Solution(object): def postorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ def peer(root): if not root: return peer(root.left) peer(root.right) res.append(root.val) res = [] peer(root) return res -
二叉树后序遍历:迭代方法
- 使用列表stack模拟入栈,将二叉树结点临时存储起来
- 按照左->右->根的思路,将结点TreeNode.val值存入res列表中
class Solution(object): def postorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ if not root:return [] cur,res,stack = root,[],[] while cur or stack: while cur: stack.append(cur) if cur.left: cur = cur.left else: cur = cur.right tmp = stack.pop() res.append(tmp.val) if stack and stack[-1].left == tmp: cur = stack[-1].right else: cur = None return res
-
二叉树遍历解法模板:
-
递归法:按照遍历思路,只需将递归函数里的
res.append(root.val)放在不同位置即可def peer(): root为空,返回 递归左子树 递归右子树 将root的值添加res中 -
迭代法:使用栈的思路。
cur,stack,res= root,[],[] while cur or stack: while 循环: cur 向左下或者右下遍历 cur 的值入栈 弹出 tmp 结点 cur 回到 tmp 左子树或者右子树 返回结果
-
三、总结:
本期,我们对二叉树三种方式的遍历:前中后序,进行对比学习。遍历二叉树实现方法可以使用递归和迭代。
学习大佬们总结的模板,拿到关于二叉树的题目时,终于一点领悟了。不过,还是需要继续练习和理解的。
以上是本期内容,欢迎大佬们点赞评论,下期见~~
参考文档:二叉树四种解法