//binary tree
//add order remove find
function tree() {
 var node = function(key) {
  this.left = null;
  this.right = null;
  this.key = key;
 };
 var root = null;
 var insertnode = function(node, newnode) {
  if(node.key > newnode.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);
   }

}

}
 var mildletreenode = function(node, callback) {
  if(node !== null) {
   mildletreenode(node.left, callback);
   callback(node.key);
   mildletreenode(node.right, callback);
  }
 }
 var beforetreenode = function(node, callback) {
  if(node !== null) {
   callback(node.key);
   beforetreenode(node.left, callback);
   beforetreenode(node.right, callback);
  }
 }
 var aftertreenode = function(node, callback) {
  if(node !== null) {
   aftertreenode(node.left, callback);
   aftertreenode(node.right, callback);
   callback(node.key);
  }
 }
 var minnode = function(node) {
  if(node) {
   while(node.left != null) {
    node = node.left;
   }
   return node.key;
  }
 }
 var maxnode = function(node) {
  if(node) {
   while(node.right != null) {
    node = node.right;
   }
   return node.key;
  }
 }
 var findnode = function(node, aim) {
  if(node === null) {
   return false;
  }
  if(node.key < aim) {
   return findnode(node.right, aim);
  } else if(node.key > aim) {
   return findnode(node.left, aim);
  } else {
   return true;
  }
 }
 var findaimnode = function(node) {
  if(node) {
   while(node.left != null) {
    node = node.left;
   }
   return node;
  }
 }
 var removenode = function(node, aim) {
  if(node === null) {
   return null;
  }
  if(node.key > aim) {
   node.left = removenode(node.left, aim);
   return node;
  } else if(node.key < aim) {
   node.right = removenode(node.right, aim);
   return node;
  } else {
   if(node.left === null && node.right === null) {
    node = null;
    return node;
   } else if(node.left !== null && node.right === null) {
    node = node.left;
    return node;
   } else if(node.left === null && node.right !== null) {
    node = node.right;
    return node;
   } else {
    var taimnode = findaimnode(node.right);
    node.key = taimnode.key;
    node.right = removenode(node.right, taimnode.key);
    return node;
   }

}
 }
 var addnode = function(node, newnode) {
  if(node.key > newnode.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);
  }
 };
 this.mildletree = function(callback) {
  mildletreenode(root, callback);
 }
 this.beforetree = function(callback) {
  beforetreenode(root, callback);
 }
 this.aftertree = function(callback) {
  aftertreenode(root, callback);
 }
 this.min = function() {
  return minnode(root);
 }
 this.max = function() {
  return maxnode(root);
 }
 this.find = function(aim) {
  return findnode(root, aim);
 }
 this.remove = function(aim) {
  return removenode(root, aim);
 }
 this.add = function(key) {
  var newnode = new node(key);
  addnode(root, newnode);
 }
}

function callback(key) {
 console.log(key);
}
//var nodes = [8, 3, 1, 6, 10, 5, 14];
//var thetree = new tree();
//nodes.forEach(function(key) {
// thetree.insert(key);
//})
//thetree.mildletree(callback);
//thetree.beforetree(callback);
//thetree.aftertree(callback);
//alert(thetree.max());
//alert(thetree.min());
//alert(thetree.find(4));
//thetree.remove(14);
//thetree.mildletree(callback);
//thetree.add(4);
//thetree.mildletree(callback)

js实现二叉树的更多相关文章

  1. 实现js的二叉树

    今天算是第一次写一篇自己的博客,越是学习就越感叹学无止境,为了记录下来用js实现二叉树的方法,这算是最简单的一个算法了. 二叉树实现原理:把数组的第一个数据当作根节点,每个节点都有根节点,左孩子和右孩 ...

  2. js 实现二叉树

    二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree),右边的总是大于左边的!二叉树的每个结点至多只有二棵子树(不存 ...

  3. jS生成二叉树,二叉树的遍历,查找以及插入

    js递归,二叉树的操作 //递归算法n次幂 function foo(n) { if (n == 1) { return 1; } else { return n * foo(n - 1); } } ...

  4. JS实现二叉树的创建和遍历

    1.先说二叉树的遍历,遍历方式: 前序遍历:先遍历根结点,然后左子树,再右子树 中序遍历:先遍历左子树,然后根结点,再右子树 后续遍历:先遍历左子树,然后右子树,再根结点   上代码:主要还是利用递归 ...

  5. 排序图解:js排序算法实现

    之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...

  6. js算法-快速排序(Quicksort)

    快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出.在平均状况下,排序n个项目要O(nLogn)次比 ...

  7. 【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)

    最近小菜鸟西瓜莹看到了一道面试题: 给定二叉树,按层打印.例如1的子节点是2.3, 2的子节点是3.4, 5的子节点是6,7. 需要建立如图二叉树: 但是西瓜莹找到的相关代码都是用js构建最优二叉树, ...

  8. javascript/js实现 排序二叉树数据结构 学习随笔

    二叉树是一种数据结构.其特点是: 1.由一系列节点组成,具有层级结构.每个节点的特性包含有节点值.关系指针.节点之间存在对应关系. 2.树中存在一个没有父节点的节点,叫做根节点.树的末尾存在一系列没有 ...

  9. 用js刷剑指offer(二叉树中和为某一值的路径)

    题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...

随机推荐

  1. 老男孩Python全栈开发(92天全)视频教程 自学笔记07

    day7课程内容: Python的编码解码 二进制 --->ASCII:只能存英文和拉丁字符,一个字符占一个字节,8位 ------->gb2312:只能6700多个中文,1980年 -- ...

  2. Mysql(六):数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...

  3. C++学习笔记第二天:几个知识点

    第一天,囫囵吞枣的把C++的基本概念撸了一遍 有几个地方不太理解,今天有针对性的学习一下 1.namespace 自定义命名空间,主要为了解决类.函数和全局变量的命名冲突问题. 调用某个命名空间里的符 ...

  4. RotatedRect 类的用法

    RotatedRect 以 Emgu.CV.Structure 为命名空间. 表示带有旋转角度的矩形. 结构说明 普通矩形的基本结构

  5. Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)

    Service Cluster IP 是一个虚拟 IP,是由 Kubernetes 节点上的 iptables 规则管理的. 可以通过 iptables-save 命令打印出当前节点的 iptable ...

  6. NLP+词法系列(一)︱中文分词技术小结、几大分词引擎的介绍与比较

    笔者想说:觉得英文与中文分词有很大的区别,毕竟中文的表达方式跟英语有很大区别,而且语言组合形式丰富,如果把国外的内容强行搬过来用,不一样是最好的.所以这边看到有几家大牛都在中文分词以及NLP上越走越远 ...

  7. GNU C 扩展之__attribute__ 机制简介

    在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相关语法及 ...

  8. linux下FFmpeg编译生成ffplay

    1.确认Makefile中指定的config.mak(在ffmpeg根目录下)中:CONFIG_FFPLAY=yes,如果不是需要重新./configure 该处还有ffmpeg.ffprobe.ff ...

  9. ASP.NET 页面双向静态化

    而我们预期的结果应该如下图,实际只请求两次. 用301重定向可以解决该循环请求产生的问题. OK, let's begin. 本文的Demo和Source是基于上一篇的,如果下面的一些文件或文件夹没有 ...

  10. jquery.lazyload.js实现图片懒加载

    个人理解:将需要延迟加载的图片的src属性全部设置为一张相同尽可能小(目的是尽可能的少占宽带,节省流量,由于缓存机制,当浏览器加载了一张图片之后,相同的图片就会在缓存中拿,不会重新到服务器上拿)的图片 ...