当前位置: 首页 > news >正文

二叉树与多叉树的遍历

二叉树的顺序存储结构

二叉树的顺序存储结构就是用一维数组存储二叉树中的各个结点,并且结点的存储位置能体现结点之间的逻辑关系。

 

二叉树的遍历

二叉树的遍历有三种方式,如下:

(1)先序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树。简记根-左-右。

(2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树。简记左-根-右。

(3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点。简记左-右-根。

假设dom结构如下:

  <div id="tree">

    <div>

      <div>
        <div></div>
        <div></div>
      </div>

      <div>
        <div></div>
        <div></div>
      </div>

    </div>

    <div>

      <div>
        <div></div>
        <div></div>
      </div>

      <div>
        <div></div>
        <div></div>
      </div>

    </div>

  </div>

遍历方式:

  var arr = [];
  // 递归先序遍历
  function recurDLR(node) {
    if (!node) {
      return;
    }
    arr.push(node);
    recurDLR(node.firstElementChild);
    recurDLR(node.lastElementChild);
  }
  // 递归中序遍历
  function recurLDR(node) {
    if (!node) {
      return;
    }
    recurLDR(node.firstElementChild);
    arr.push(node);
    recurLDR(node.lastElementChild);
  }
  // 递归后序遍历
  function recurLRD(node) {
    if (!node) {
      return;
    }
    recurLRD(node.firstElementChild);
    recurLRD(node.lastElementChild);
    arr.push(node);   
  }

 

多叉树结构遍历

  // 递归先序遍历 先遍历子节点 再遍历根节点
  function recurDLR(node) {
    if (!node) {
      return;
    }
    arr.push(node);
    for (let i = 0; i < node.children.length; i++) {
      if (node.children[i].nodeName.toLowerCase() === 'div') {
        recurDLR(node.children[i]);
      }      
    }   
  } 
  // 递归后序遍历 先遍历根节点 再遍历子节点
  function recurLRD(node) {
    if (!node) {
      return;
    }
    for (let i = 0; i < node.children.length; i++) {
      if (node.children[i].nodeName.toLowerCase() === 'div') {
        recurLRD(node.children[i]);
      }
    }
    arr.push(node);
  }

  // 层序遍历 从根节点一层一层向下遍历
  // 原理就是利用数组的后进先出 存储dom节点
  function recurLDR(node) {
    var stack = [];
    stack.push(node);
    var del = stack.shift();
    while (del) {    
      for (let i = 0; i < del.children.length; i++) {
        if (del.children[i].nodeName.toLowerCase() === 'div') {
          stack.push(del.children[i]);
        }
      }
      arr.push(del);
      del = stack.shift();
    }        
  }

 

转载于:https://www.cnblogs.com/gr07/p/7880173.html

相关文章:

  • 矩阵优化总结
  • CentOS源码安装Python3.6
  • js 判断各种数据类型 typeof 几种类型值
  • 如何下载最新版本和旧版本的eclipse?
  • LVS_DR 安装后无法转发真实服务器,但是配置其他方面都检查的没有问题了。就剩在realserver这边没有在lo口上绑定VIP了...
  • 各种排序算法思想复杂度及其java程序实现
  • 14章 变宽度网页布局剖析于制作
  • 实训之压缩软件
  • HighCharts 特性;Highcharts 环境配置
  • Django - Python3 常用命令
  • 新手对Spring的图解和一点个人理解
  • 项目整体管理
  • 用JDK自带的包来解析XML文件(DOM+xpath)
  • python学习笔记——Day 4
  • 构建自己的知识认知体系
  • 【React系列】如何构建React应用程序
  • Android 架构优化~MVP 架构改造
  • JavaScript标准库系列——Math对象和Date对象(二)
  • learning koa2.x
  • PAT A1092
  • QQ浏览器x5内核的兼容性问题
  • Quartz初级教程
  • tensorflow学习笔记3——MNIST应用篇
  • vue.js框架原理浅析
  • 从零开始在ubuntu上搭建node开发环境
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 巧用 TypeScript (一)
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 微信公众号开发小记——5.python微信红包
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 优化 Vue 项目编译文件大小
  • 由插件封装引出的一丢丢思考
  • 【云吞铺子】性能抖动剖析(二)
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # .NET Framework中使用命名管道进行进程间通信
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2020)Java后端开发----(面试题和笔试题)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • [ C++ ] STL---string类的模拟实现
  • [4.9福建四校联考]
  • [ANT] 项目中应用ANT
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [BZOJ3223]文艺平衡树
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [ESP32] 编码旋钮驱动
  • [hdu2196]Computer树的直径