二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。

这是维基百科给的定义。

如上图就是一个二叉树,二叉树的每个节点最多只有两个分支,所以第n层最多2^(n - 1)个节点,而k层总共最多有2^(k + 1) - 1个节点

二叉树的遍历分为三种

  • 前序遍历
  • 中序遍历
  • 后序遍历

首先要知道,所谓的前序中序后序是什么意思?他们是指在遍历过程中中间节点的结果收集或者处理顺序。每次都是从根节点开始扫描,或者说从中间的节点开始扫描。如果先收集中间节点,再左节点,再右节点,就是前序遍历;如果先收集处理左节点,再中间节点,再右节点,就是中序遍历;如果先处理左节点,然后右节点,最后中间节点,就是后序遍历。

更容易理解的方式是:如果二叉树只有两层,比如这里只有1, 2, 3三个节点,那么 1 -> 2 -> 3就是前序遍历(优先处理1节点),2 -> 1 -> 3就是中序遍历(1节点中间顺序被处理),2 -> 3 -> 1就是后序遍历(1节点最后被处理)。这里的前 中 后就是1在结果处理中的顺序。

在代码实现时,一般采用深度优先遍历 deep first search(优先访问子节点)的方式。

/**1**/function binaryTree(root: TreeNode | null): number[] {/**2**/    const res = []
/**3**/    function dsf(node: TreeNode | null) {/**4**/        // 递归退出条件
/**5**/        if (node === null) {/**6**/            return
/**7**/        }
/***********************8**********************/
/**9**/        // 如果左子节点存在,递归遍历左子树
/**10**/        node.left && dsf(node.left)
/**********************11**********************/
/**12**/        // 如果右子节点存在,递归遍历左子树
/**13**/       node.right && dsf(node.right)
/**********************14**********************/
/**15**/    }
/**16**/    dsf(root)
/**17**/}

通过递归的方式访问到了所有节点,在前中后序遍历下,只是处理结果的位置不同:

  • 前序,优先收集中间节点。所以在判断当前节点不是null之后就可以收集,即第8行的位置收集节点值
  • 中序,左->中->右,先要遍历完左节点再收集,所以要在第11行的位置收集节点值
  • 后续,左->右->中,遍历左右节点之后再收集,所以要在第14行的位置收集节点值
  1. 前序完整代码
function preorderTraversal(root: TreeNode | null): number[] {const res: number[] = []function dfs(node: TreeNode | null) {if (node === null) returnres.push(node.val)node.left && dfs(node.left)node.right && dfs(node.right)}dfs(root)return res
};
  1. 中序完整代码
function inorderTraversal(root: TreeNode | null): number[] {const res = []function dfs(node: TreeNode | null) {if (node === null) return        node.left && dfs(node.left)res.push(node.val)node.right && dfs(node.right)}dfs(root)return res
};
  1. 后序完整代码
function postorderTraversal(root: TreeNode | null): number[] {const res = []function dfs(node: TreeNode | null) {if (node === null) returnnode.left && dfs(node.left)node.right && dfs(node.right)res.push(node.val)}dfs(root)return res
};

二叉树的前中后序遍历相关推荐

  1. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

    二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...

  2. Java二叉树的前中后序遍历

    Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...

  3. 数据结构之二叉树的前中后序遍历以及层序遍历

    学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...

  4. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  5. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)

    文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...

  6. 二叉树的前中后序遍历(考试常考)

    二叉树遍历的概念 二叉树的遍历是按某种规则对二叉树的每个节点均只被访问一次,根据根节点访问位置的不同分为三种:先序遍历(根左右).中序遍历(左根右).后序遍历(左右根).         由于树是通过 ...

  7. 【数据结构】二叉树的前中后序遍历

    二叉树的三种遍历 1. 创建一棵简单的二叉树 1.1 二叉树结构体实现 1.2 创造一个二叉树结点的函数 1.3 手动创造一棵二叉树 2.为什么要遍历? 3.最重要的知识:由二叉树引出的子问题分析 4 ...

  8. 二叉树的前中后序遍历之迭代法(统一风格迭代方式)

    一.前序遍历(迭代法)->右左中 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子. 为什么要先加入 右孩子,再加入左孩子呢?因为这样出栈的时候 ...

  9. (必背)二叉树的前中后序遍历(利用栈)

    二叉树的前序遍历(利用栈) 1.首先将根节点压入栈 2.栈中的首元素出栈,然后先将其右节点压入栈中,再将栈中的左节点压入栈中(如果左右节点分别存在的话) 3.重复步骤2直到栈为空 class Solu ...

  10. 二叉树的前中后序遍历(栈)(C++)

    二叉树的遍历是很基础的东西,用递归是很简洁明了的写法,但是栈的写法也可以了解一下 #include<vector> #include<stack> struct TreeNod ...

最新文章

  1. 如何打赢一场唯快不破的比赛,看看他们的绝招
  2. C++实现仿射加密法
  3. 截取两个标签之间的文本
  4. JavaScript正则表达式-基础入门
  5. python工程师笔试题_2019年,Python工程师必考的6个面试题,Python面试题No5
  6. 一些关于网页标题的动态js特效
  7. python watchdog_Python watchdog
  8. LVS+ldirector实现负载均衡
  9. 君信财富获数千万元战略投资,投资方为银江集团
  10. Redis 安装配置(一)
  11. Android TextView 显示圆圈背景或者设置圆角、圆形
  12. 前端神器-网站图片抓取精灵V1.0正式发布
  13. 深度学习画图软件收集
  14. 什么是Proxy Server
  15. tms320c54x汇编语言,TMS320C54x DSP原理及应用
  16. python画围棋棋盘_python3 turtle 画围棋棋盘
  17. 小程序项目:基于微信小程序音乐播放器——计算机毕业设计
  18. Linux设备模型分析之bus(基于3.10.1内核)
  19. 合肥耀之阳电商:店铺商品属性怎么样修改
  20. Python练习题19求多项式的和

热门文章

  1. ISSCC 2017论文导读 Session 14:A 288μW Programmable Deep-Learning Processor with 270KB On-Chip Weight
  2. 联通宽带光猫获取超级密码教程!!
  3. 极客学院微信小程序视频教程
  4. html文件怎么用华为手机打开,如何调整华为手机中的文件默认打开方式
  5. STM32 实现光敏传感器
  6. 浪潮服务器网卡驱动丢失怎么修复,电脑丢失网卡驱动,学会这一招,轻松搞定...
  7. Java后端技术概览
  8. matlab简支梁有限元分析,1.3 简支梁的有限元分析
  9. Bartender软件使用VB判断条件并返回值
  10. 综合布线实训室建设方案(完整版)