1、先说二叉树的遍历,遍历方式:

   前序遍历:先遍历根结点,然后左子树,再右子树

   中序遍历:先遍历左子树,然后根结点,再右子树

   后续遍历:先遍历左子树,然后右子树,再根结点

 

上代码:主要还是利用递归

  1. function TreeCode() {
  2. let BiTree = function (ele) {
  3. this.data = ele;
  4. this.lChild = null;
  5. this.rChild = null;
  6. }
  7.  
  8. this.createTree = function () {
  9. let biTree = new BiTree('A');
  10. biTree.lChild = new BiTree('B');
  11. biTree.rChild = new BiTree('C');
  12. biTree.lChild.lChild = new BiTree('D');
  13. biTree.lChild.lChild.lChild = new BiTree('G');
  14. biTree.lChild.lChild.rChild = new BiTree('H');
  15. biTree.rChild.lChild = new BiTree('E');
  16. biTree.rChild.rChild = new BiTree('F');
  17. biTree.rChild.lChild.rChild = new BiTree('I');
  18. return biTree;
  19. }
  20. }
  21.  
  22. //前序遍历
  23. function ProOrderTraverse(biTree) {
  24. if (biTree == null) return;
  25. console.log(biTree.data);
  26. ProOrderTraverse(biTree.lChild);
  27. ProOrderTraverse(biTree.rChild);
  28. }
  29.  
  30. //中序遍历
  31. function InOrderTraverse(biTree) {
  32. if (biTree == null) return;
  33. InOrderTraverse(biTree.lChild);
  34. console.log(biTree.data);
  35. InOrderTraverse(biTree.rChild);
  36. }
  37.  
  38. //后续遍历
  39. function PostOrderTraverse(biTree) {
  40. if (biTree == null) return;
  41. PostOrderTraverse(biTree.lChild);
  42. PostOrderTraverse(biTree.rChild);
  43. console.log(biTree.data);
  44. }
  45.  
  46. let myTree = new TreeCode();
  47. console.log(myTree.createTree());
  48. console.log('前序遍历')
  49. ProOrderTraverse(myTree.createTree());
  50. console.log('中序遍历')
  51. InOrderTraverse(myTree.createTree());
  52. console.log('后续遍历')
  53. PostOrderTraverse(myTree.createTree());

二叉树的非递归遍历

  深度优先遍历(主要利用栈的先进后出)

  广度优先遍历(主要利用队列的先进先出)

  1. //深度优先非递归
  2. function DepthFirstSearch(biTree) {
  3. let stack = [];
  4. stack.push(biTree);
  5.  
  6. while (stack.length != 0) {
  7. let node = stack.pop();
  8. console.log(node.data);
  9. if (node.rChild) {
  10. stack.push(node.rChild);
  11. }
  12. if (node.lChild) {
  13. stack.push(node.lChild);
  14. }
  15.  
  16. }
  17.  
  18. }
  19.  
  20. //广度优先非递归
  21. function BreadthFirstSearch(biTree) {
  22. let queue = [];
  23. queue.push(biTree);
  24. while (queue.length != 0) {
  25. let node = queue.shift();
  26. console.log(node.data);
  27. if (node.lChild) {
  28. queue.push(node.lChild);
  29. }
  30. if (node.rChild) {
  31. queue.push(node.rChild);
  32. }
  33. }
  34.  
  35. }

深度优先主要是利用栈,先压右子树,再压左子树

广度优先主要利用队列,先入左子树,再入右子树

深度优先的遍历结果与前序遍历相同ABDGHCEIF,广度优先的遍历结果是 ABCDEFGHI

2、创建二叉树

  1中创建二叉树的方式过于笨拙,假入我们根据完全二叉树的模型建立自己的二叉树,空数据的地方用#表示,如下图所示我们称之为扩展二叉树,我们取其前序遍历的序列 AB#D##C##。

上代码:也是利用递归

  1. //前序遍历得到的字符串
  2. let strArr = 'AB#D##C##'.split('');
  3.  
  4. function BiTree(ele) {
  5. this.data = ele;
  6. this.lChild = null;
  7. this.rChild = null;
  8. }
  9. var newTree = new BiTree('#');
  10.  
  11. function createBiTree(biTree) {
  12. if (strArr.length == 0) return;
  13. let str = strArr.shift();
  14. if (str == '#') return;
  15. biTree.data = str;
  16. if (strArr[0] != '#') {
  17. biTree.lChild = new BiTree('#')
  18. }
  19. createBiTree(biTree.lChild);
  20. if (strArr[0] != '#') {
  21. biTree.rChild = new BiTree('#')
  22. }
  23. createBiTree(biTree.rChild);
  24. }
  25. createBiTree(newTree);
  26. console.log(newTree);
  27. ProOrderTraverse(newTree)

  你也可以用中序遍历或者后序遍历实现二叉树的创建,代码里生成结点和构建左右子树的代码顺序交换一下就行了

JS实现二叉树的创建和遍历的更多相关文章

  1. c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)

    二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...

  2. Java实现二叉树的创建和遍历操作(有更新)

    博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...

  3. 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)

    要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...

  4. JS实现图的创建和遍历

    图分为无向图和有向图 图的存储结构有邻接矩阵.邻接表.十字链表.邻接多重表这四种,最常用的是前两种 本篇主要是利用邻接矩阵实现无向图的创建和遍历(深度优先.广度优先),深度优先其实就是二叉树里的前序遍 ...

  5. 剑指offer十七姊妹篇之二叉树的创建、遍历、判断子二叉树

    1.二叉树节点类 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tr ...

  6. JS DOM操作(创建、遍历、获取、操作、删除节点)

    创建节点 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="u ...

  7. 二叉树的创建和遍历(C版和java版)

    以这颗树为例:#表示空节点前序遍历(根->左->右)为:ABD##E##C#F## 中序遍历(左->根->右)为:#D#B#E#A#C#F# 后序遍历(左->右-> ...

  8. 《Cracking the Coding Interview 》之 二叉树的创建 与 遍历(非递归+递归version)

    #include <iostream> #include <cstdio> #include <vector> #include <stack> #de ...

  9. 第8章:LeetCode--算法:二叉树的创建、遍历、删除、求高度

    创建> 需要给定一个root的key,所有小于这个key的放到左边,大于key的放到右边, 比如vector<int> tree = {5,2,7,1,9,3,8},最后的树: 5 ...

随机推荐

  1. django系列6--Ajax03 ajax参数

    ajax的参数 data: 当前ajax请求要携带的数据,是一个json的object对象,ajax方法会默认的把它编码成某种格式 (urlencoded:?a=1&b=2)发送给服务端;此外 ...

  2. Python3.5 学习三

    对文件的操作 打开模式: 1 f=open("xxx","r",encoding=="utf-8") 只读 2 f=open("x ...

  3. jquery源码解析:jQuery数据缓存机制详解1

    jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...

  4. 【FAQ】tomcat启动jdk版本不一致

    一.tomcat7.exe与startup.bat的区别: 1.这两个都可以启动tomcat,但tomcat7.exe必须安装了服务才能启动,而startup.bat不需要 2.另外一个区别是它们启动 ...

  5. jdk(1.8)命令行工具(二)

    2.3 jinfo:java配置信息工具 jinfo(Configuration Info for Java)的作用是实时的查看和调整虚拟机的各项参数.使用jps -v 可以查看虚拟机启动时显示指定的 ...

  6. linux防火墙(五)—— 防火墙的规则备份与还原

    一.第一种备份还原用法,使用工具 iptables-save >/opt/iprules.txt iptables-restore < /opt/iprules.txt #注意导入的文件必 ...

  7. Spring aop+自定义注解统一记录用户行为日志

    写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...

  8. 4.1.1 Choosing the SST Donor

    摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...

  9. i2c_smbs 函数

    i2c_smbus系列函数有: s32 i2c_smbus_read_byte(const struct i2c_client *client); s32 i2c_smbus_write_byte(c ...

  10. CODEVS-1215迷宫

    迷宫 原题:传送门 题目描述 Description 在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走.从左上角((0,0)“s”)位置处走到右下角((n-1, ...