目录

  • 1、构造二叉树
  • 2、递归遍历
  • 3、非递归遍历
    • 3.1 先序
    • 3.2 中序
    • 3.3 后序

1、构造二叉树

树节点:

// 二叉树节点的构造函数
function TreeNode(val, left, right) {this.val = (val===undefined ? 0 : val)this.left = (left===undefined ? null : left)this.right = (right===undefined ? null : right)
}

下面我们需要遍历下面这颗二叉树:

遍历结果:
先序:“中 - 左 - 右” 0137849256
中序:“左 - 中 - 右” 7381940526
后序:“左 - 右 - 中” 7839415620

2、递归遍历

调用递归的位置不同,结果分为三种。

var preorder = []// 前序结果
var inorder = []// 中序结果
var postorder = []// 后序结果var loop = function(root){// 当前节点为空,表示达到了叶子节点if (root == null) returnpreorder.push(root.val)  // 前序loop(root.left)inorder.push(root.val)// 中序loop(root.right)postorder.push(root.val)// 后序
}
loop(root)

3、非递归遍历

3.1 先序

  1. 根节点入栈,依此取出栈顶元素。
  2. 访问栈顶元素,同时出栈,将栈顶元素作为当前元素,当前元素右节点入栈,左节点入栈(注意:右先入那么右后出)。
  3. 重复上述操作,直到整个栈为空时,则遍历结束。
var preorderTraversal = function(root) {var arr = []arr.push(root)var res = []while (arr.length) {var temp = arr.pop()if (!temp) break;//当前节点的值放入结果数组res.push(temp.val)//右子树入栈if (temp.right) {arr.push(temp.right)}//左子树入栈if (temp.left) {arr.push(temp.left)}}return res
};

3.2 中序

  1. 循环将根节点和其的左子树入栈。
  2. 直到左子树为空时,访问栈顶元素,同时将栈顶元素作为当前元素,并出栈。
  3. 开始访问右子树,循环出栈直到整个栈为空时,则遍历结束。
var inorderTraversal = function(root) {var res = []var arr = []while(arr.length || root) {if (root) {arr.push(root)root = root.left} else {let temp = arr.pop()res.push(temp.val)root = temp.right}}return res
};

3.3 后序

和前序遍历思想相反。
先序是使用push往res数组后面加数据,二后序是使用unshift往数组前面加数据。

var postorderTraversal = function(root) {var arr = []arr.push(root)var res = []while(arr.length) {var temp = arr.pop()if (!temp) breakres.unshift(temp.val)// 从前往后塞入数据if(temp.left) {// 左节点先入栈arr.push(temp.left)}if(temp.right) {arr.push(temp.right)}}return res
};

JavaScript算法 — 二叉树遍历相关推荐

  1. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /**二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中*** ...

  2. 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)

    zsychanpin 博客园 首页 新随笔 联系 订阅 管理 树的基本概念和遍历规则 树的递归定义 树是n(n>0)个结点的有限集,这个集合满足下面条件:       ⑴有且仅有一个结点没有前驱 ...

  3. C#二叉树遍历算法实现浅析

    C#算法实现了二叉树的定义,怎么构造一颗已知的二叉树,用几种常规的算法(先序,中序,后序,层次)进行C#二叉树遍历.希望能给有需要人带来帮助,也希望能得到大家的指点.有关C#数据结构的书在书店里找到, ...

  4. 数据结构与算法-- 二叉树后续遍历序列校验

    二叉树后续遍历序列校验 题目:输入一个整数数组,判断改数组是否是某个二叉搜索树的后续遍历结果,如果是返回true否则false,假设输入数组的任意两个数字不相同. 例如输入{5,7,6,9,11,10 ...

  5. 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

    [本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树二叉树的创建,关系建立二叉树的创建 ...

  6. 二叉树遍历之中序遍历算法(非递归、递归)入门详解

    一.引言 二叉树的遍历常见的方法有先序遍历.中序遍历.后序遍历和层次遍历等,本文给出了C语言版本的中序遍历二叉树的非递归算法和递归算法. 中序遍历的原理很简单,也就是把树根的访问放在中间.访问结点的次 ...

  7. 基于计数栈的非递归二叉树遍历算法

    转载请保留完整信息! 作者:中山大学 赵耀 10389332 创作时间:2013.11.25 发表时间:2013.12.11 背景 遍历算法一般可按深度优先或广度优先进行.对于二叉树,深度优先遍历可分 ...

  8. 【树】二叉树遍历算法(深度优先、广度优先遍历,前序、中序、后序、层次)及Java实现...

    [树]二叉树遍历算法(深度优先.广度优先遍历,前序.中序.后序.层次)及Java实现 目录 一.前序遍历 二.中序遍历 三.后序遍历 四.层次遍历 遍历的作用 二叉树是一种非常重要的数据结构,很多其它 ...

  9. [算法] 二叉树的 先序遍历、中序遍历、后序遍历

    本文根据清华大学邓俊辉老师课程<数据结构>总结,课程地址 . 遍历介绍 按照事先约定的某种规则或次序,对节点各访问一次而且仅一次.与向量和列表等线性结构一样,二叉树的这类访问也统称为遍历( ...

最新文章

  1. HDU1559(二维树状数组)
  2. DIY自己的AI助理,萝莉御姐暖男霸道总裁全凭你定义,微软小冰团队发布新框架...
  3. 首次安装Revit失败
  4. html中autocomplete无效,OnChange和AutoComplete都不能使用HTML.TextBox
  5. pyqt控件显示重叠_Python编程:一个不错的基于PyQt的Led控件显示库,建议收藏学习...
  6. esc键没反应_有机人名反应——Brown 硼氢化反应(Brown Hydroboration)
  7. Redis 哨兵模式
  8. 嵌入式 linux usb转串口,Linux下,USB转串口问题
  9. Step By Step (zz from UESTC)
  10. 安恒杯月赛 babypass getshell不用英文字母和数字
  11. PIP scrapydo时报错ERROR: Command errored out with exit status 1: python setup.py egg_info Check the log
  12. thinkphp建站-前后台文件配置
  13. 哨兵卫星影像数据Sentinel-1基本参数
  14. 蓝牙音箱连接成功但没有声音还是电脑的声音
  15. Ubuntu10.10 CAJView安装 读取nh\kdh\caj文件 成功
  16. 工作流开源系统--DRAKE
  17. 在Excel中将人民币金额小写转成大写(转)
  18. 大数据HBase_04_01
  19. html语言怎么做到走马灯,HTML+CSS入门 如何实现跑马灯/走马灯效果
  20. 计算机经验交流活动简报,经验交流会简讯.doc

热门文章

  1. Python运算符及用法(超级详细)
  2. 任务栏没有输入法的解决方法
  3. 计算机出国读研需要准备什呢,出国留学做哪些准备什么东西
  4. 爬取智联招聘有用信息存入数据库
  5. WIFI基础入门--802.11--管理操作--9
  6. js字符串的拼接及转换
  7. 美国伊州一座化工厂发生爆炸事故 致1人死亡2人失踪
  8. 跟我学制作基于springboot健身房私人教练预约管理系统vue
  9. 【python】——setattr为模块动态添加属性
  10. Vue.js 面试题大全