leetcode-explore-learn-数据结构-二叉树1

  • 1.二叉树的深度优先遍历
    • 1.1前序遍历:中左右
    • 1.2中序遍历:左中右
    • 1.3后序遍历:左右中
  • 2.二叉树的广度优先遍历

本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/

所有例题的编程语言为python
二叉树节点结构:

class TreeNode(object):def __init__(self, x):self.val = xself.left = Noneself.right = None

1.二叉树的深度优先遍历

二叉树的深度优先的三种遍历方式:这个序就是根节点在什么时候遍历

1.1前序遍历:中左右

递归的框架有了,如何在res list中加入答案,在内层再定义一个函数,

class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_pre(node):if node==None:returnres.append(node.val)dfs_pre(node.left)dfs_pre(node.right)dfs_pre(root)return res

迭代的框架:当前节点的右子树放入堆栈,存起来。将当前节点的值放入res,当前节点更新为当前节点的左子树节点。

class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(node or stack):if node:res.append(node.val)if node.right:stack.append(node.right)node=node.leftelse:node=stack.pop()return res

1.2中序遍历:左中右

递归的框架和先序遍历一样。

class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_inorder(node):if node==None:returndfs_inorder(node.left)res.append(node.val)dfs_inorder(node.right)dfs_inorder(root)return res

迭代框架:需要将什么放stack中呢,根节点一路向左遍历到底部。将根节点都放进去,放进去的就是有的节点。遍历到底端之后,逐个弹出;然后去该节点的右子树,如果右子树为空,就会弹该节点的父亲节点;如果右子树不为空,就可以迭代进去处理右子树。

class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(stack or node):if node:stack.append(node)node=node.leftelse:node=stack.pop()res.append(node.val)node=node.rightreturn res

1.3后序遍历:左右中

递归的框架和先序,中序遍历一致

class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_post(node):if node==None:returndfs_post(node.left)dfs_post(node.right)res.append(node.val)dfs_post(root)return res

迭代的框架:中右左的逆序,就是左右中。在伪前序遍历(保存左节点)的结果下,逆序输出即可。

class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(stack or node):if node:res.append(node.val)if node.left:stack.append(node.left)node=node.rightelse:node=stack.pop()return res[::-1]

2.二叉树的广度优先遍历

–层次遍历,用队列来帮助实现广度优先遍历

递归框架: 需要有一个level信息用于存储该节点所处的层次。问题:在哪里新增res的层次呢–解决方案,先判断l层次是否存在,不在的话新增。

class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []res=[]def bfs(node,l):if node==None:returnif l>len(res)-1:res.append([])res[l].append(node.val)bfs(node.left,l+1)bfs(node.right,l+1)bfs(root,0)return res

迭代框架:队列,先进先出,每层先统计队列的长度,确认要弹出的元素个数。

class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []que=[root]res=[]l=0while(que):n=len(que)res.append([])for i in range(n):node=que.pop(0)res[l].append(node.val)if node.left:que.append(node.left)if node.right:que.append(node.right)l+=1return res

算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历相关推荐

  1. 【LeetCode】专题一 二叉树层序遍历

    二叉树层序遍历 在本文中,我将会选取LeetCode上二叉树层序遍历的多道例题,并给出解答,通过多道题我们就可以发现,二叉树的层序遍历并不复杂,并且有着共通点. 102. 二叉树的层序遍历 给你二叉树 ...

  2. 数据结构——二叉树的遍历

    "树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点 ...

  3. 数据结构 - 二叉树的遍历

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 二叉树的遍历 N:访问根结点,L:遍历根结点的左子树 ...

  4. 第五期 C/C++数据结构 二叉树的遍历以及结点数、深度

    代码详见后面 实验三 树和二叉树 一.实验目的 1.使学生熟练掌握二叉树的逻辑结构和存储结构(重点). 2.熟练掌握二叉树的各种遍历算法(难点). 二.实验原理及说明 1. 前序遍历算法思想: (1) ...

  5. 数据结构-二叉树层次遍历

    首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历:思路如下: 先将二叉树根节点入队,然后出队,访问该 ...

  6. 数据结构-二叉树的遍历

    二叉树是每个结点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查 ...

  7. java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)

    二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...

  8. Java数据结构——二叉树的遍历

    作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客 ...

  9. python算法与数据结构-二叉树的遍历

    广度优先遍历和深度优先遍历代码如下所示: # coding=utf-8class Node(object):#尽量不加3个引号的注释了容易报错def __init__(self, item):self ...

  10. 数据结构 二叉树的遍历

    所谓遍历, 无非就是把1个容器的所有元素逐个输出, 而这个输出是线性的. 但是二叉树是1个非线性的容器,  如何把它的元素按一定顺序输出就是1个值得学习的课题了. 一般来讲, 遍历二叉树有3种方法, ...

最新文章

  1. 产品经理真的是「背锅侠」吗?
  2. 关于安卓Apk反编译 再编译回来不能正常安装的问题
  3. c++-内存管理-内存对齐方式
  4. JavaScript——以简单的方式理解闭包
  5. 如何在数字化转型战略中真正获得价值?浅谈数字化转型的四个层级
  6. mongodb自动备份脚本
  7. 为你的网站加上SSL,可以使用HTTPS进行访问
  8. Elipse 、Idea配置 Java-Code-Formatter
  9. windows 弹shell_Windows系统常用免费软件“红黑榜”
  10. vue仿微博评论回复_Vue之 3.0升级
  11. ClickHouse最简单的安装方法
  12. css设置字体的行数,超出显示...
  13. ORACLE RAC 视频教程
  14. 2020年06月16日_万金油_新浪博客
  15. IT毕业生给学弟学妹们的真心话——离校座谈记录
  16. oho,找工作有点难度
  17. 鲸探发布点评:7月7日发售陈孟昕系列绘画数字藏品
  18. k叉树的性质_相关树及性质
  19. 盘点国内优秀的机器人公司
  20. Servlet学习之Servlet概念与运行流程

热门文章

  1. 解决asterisk sip呼叫 488 no acceptable here
  2. 网络编程模型综述 之 UNIX网络I/O模型
  3. 设计模式C++实现(6)——适配器模式
  4. c语言整型数组操作,c语言的数组操作|时刻需
  5. python多级字典_Python多层字典取值
  6. @value 静态变量_Java中的变量——通过示例学习Java编程(4)
  7. 【转】Ubuntu Desktop下自动启动终端并运行脚本
  8. 【转】C# DataTable使用方法详解
  9. ABP入门系列(3)——领域层定义仓储并实现
  10. CCIE-LAB-第二篇-端口聚合LACP+RSTP