IMOOC icon indicating copy to clipboard operation
IMOOC copied to clipboard

JavaScript实现二叉树算法

Open CruxF opened this issue 7 years ago • 0 comments

前言

这篇文章的内容几乎全部来源于慕课网教程——《JavaScript实现二叉树》,教程内容值得一看,虽然最终的游戏代码那块讲述的并不完整,然而让人基本的认知到什么是二叉树这是讲的挺不错的,下面就来看看我的一些摘抄。

为什么是JavaScript和数据结构?

JavaScript自从诞生以来,经过多年的发展,目前已经成为几乎是最流行的语言,俗称为“互联网编程语言”。他的发展越来越快,并且将触角延伸到了各个领域,几乎有一统江湖之势。

从客户端而言,特使是web应用开发上,它是当之无愧的首选,结合各种强大的开发框架,运用JavaScript可以开发出功能相当强大的web桌面应用,例如像Gmail这种完全能媲美于原生桌面程序的web应用,就是通过JavaScript开发的。

从服务器而言,原本被C++,java等老牌语言占据着不可动摇的地位,当以JavaScript为开发语言的Node.js平台诞生后,老牌语言在服务器领域的地位在不断消亡,Node.js就像野火一样,在服务器开发领域熊熊燃烧。

最后,在移动开发领域,由于React Native,或lonic等移动开发框架的出现,使得运用JavaScript就能开发出同时运行在IOS和Android平台上的移动App。由此可见,学习和使用JavaScript这门编程语言是性价比最高的。

为什么要学习数据结构?

程序=算法+数据结构,计算机程序设计的本质是将业务逻辑转换为数理逻辑,通过逻辑推理以及数理运算解决客观世界存在的困难,而算法和数据结构就是数理逻辑的推演模式和展现方法。如果把编程语言比作文字,那么算法和数据结构就相当于语法,没有合理的语法,文字就无法准确的传达意义。

数据结构就相当于:我塞牙了,那么就要用到牙签这“数据结构”,当然你用指甲也行,只不过“性能”没那么好;我要拧螺母,肯定用扳手这个“数据结构”,当然你用钳子也行,只不过也没那么好用。学习数据结构,就是为了了解以后在IT行业里搬砖需要用到什么工具,这些工具有什么利弊,应用于什么场景。以后用的过程中,你会发现这些基础的“工具”也存在着一些缺陷,你不满足于此工具,此时,你就开始自己在这些数据结构的基础上加以改造,这就叫做自定义数据结构。而且,你以后还会造出很多其他应用于实际场景的数据结构。。你用这些数据结构去造轮子,不知不觉,你成了又一个轮子哥。

单步调试

概念: 单步调试是指程序开发中,为了找到程序的bug,通常采用的一种调试手段,一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因。

Chrome浏览器单步调试步骤: 打开开发工具 —>点击sources—>点击要调试的文件—>点击某一条要调试的代码(左侧行数)—>刷新页面—>点击页面上的下一步来查看显示的结果是否和预期的一样。

排序二叉树

排序二叉树最大的功能就是能够快速有效的对很多数据进行排序。它的特点是左孩子的数值要小于根节点,右孩子的数值要大于根节点,详情请看下图。

什么是二叉树?

二叉树是一种具有层级特性的数据结构,一棵树包含多个节点(下图中的每一个圆圈),节点自身含有一个属性,就是它所代表的数值(圆圈中的数值)。节点与节点间有对应关系,一种叫做父子关系,例如图中,节点8引出一个箭头指向节点3,于是我们说,节点8是节点3的父亲,节点3是节点8的儿子;另外一种叫做兄弟关系,比如节点3和节点10,因为他们都有同一个父节点。 image

二叉树创建代码实现

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
  </head>
  <body>
    <script>
      function BinaryTree() {
        //创建一个节点
        var Node = function (key) {
          this.key = key;
          this.left = null;
          this.right = null;
        };
        //创建一个根节点
        var root = null;
        var insertNode = function (node, newNode) {
          if (newNode.key < node.key) {
            if (node.left === null) {
              node.left = newNode;
            } else {
              insertNode(node.left, newNode);
            }
          } else {
            if (node.right === null) {
              node.right = newNode;
            } else {
              insertNode(node.right, newNode);
            }
          }
        }
        //创建一个函数用来插入节点
        this.insert = function (key) {
          var newNode = new Node(key);
          if (root === null) {
            root = newNode;
          } else {
            insertNode(root, newNode);
          }
        };
      }
      var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13];
      var binaryTree = new BinaryTree();
      nodes.forEach(function (key) {
        binaryTree.insert(key);
      });
    </script>
  </body>
</html>

二叉树中序遍历

遍历规则:左中右。比如上图中序遍历为:1、3、4、6、7、8、10、13、14

二叉树中序遍历核心代码

//中序遍历的方法
var inOrderTraverseNode = function (node, callback) {
  if (node !== null) {
    inOrderTraverseNode(node.left, callback);
    callback(node.key);
    inOrderTraverseNode(node.right, callback);
  }
}
//中序遍历的接口
this.inOrderTraverse = function (callback) {
  inOrderTraverseNode(root, callback);
}

完整代码

二叉树前序遍历算法原理

使用前序遍历去赋值一颗二叉树效率是最高的。前序遍历规则是:中左右。比如上图前序遍历为:8、3、1、6、4、7、10、14、13

前序遍历核心代码

//前序遍历的方法
var preOrderTraverseNode = function (node, callback) {
  if (node !== null) {
    callback(node.key);
    preOrderTraverseNode(node.left, callback);
    preOrderTraverseNode(node.right, callback);
  }
}
//前序遍历的接口
this.preOrderTraverse = function (callback) {
  preOrderTraverseNode(root, callback);
}

完整代码

二叉树后序遍历原理

后序遍历可以应用到操作系统的文件系统的遍历之中,遍历规则为:左右中。比如上图后序遍历为:1、4、7、6、3、13、14、10、8

二叉树后序遍历核心代码

//后序遍历的方法
var postOrderTraverseNode = function (node, callback) {
  if (node !== null) {
    postOrderTraverseNode(node.left, callback);
    postOrderTraverseNode(node.right, callback);
    callback(node.key);
  }
}
//后序遍历的接口
this.postOrderTraverse = function (callback) {
  postOrderTraverseNode(root, callback);
}

完整代码

二叉树排序的相关应用

拓展

打起精神来,文章到这还没结束呢,这里不是讲解小游戏代码的实现原理,而是继续二叉树另外一个重要的概念“红黑树”!

偷下懒,下面给大家推荐一则十分良心有趣的漫画——什么是红黑树?

CruxF avatar Feb 24 '18 14:02 CruxF