/**
* 树,一种非线性的数据结构。 以分层的方式存储数据。
* 一棵树最上面的节点成为根节点,如果一个节点下面有多个节点,这个节点称为父节点,下面的节点称为子节点
* 没有任何子节点的节点,陈宝国职位叶子节点。
*
* 二叉树是每个节点最多有两个子树的有序树
* 从一个节点到另外一个节点称为路径
* 树有层的概念,根节点是 0层,那它的子节点是第一层,以此类推。
* 因为二叉树中,子节点只有两个,那么数据的查找,删除,插入实现起来就速度很快(因为非节点一就是节点二~
*
* 二叉查找树 是一个特殊的二叉树,相对较小的值保存在左边子节点,较大值保存在右边子节点。
*
* 示例:
* ( 56 )
* / \
* (22) (81)
* / \ / \
* (10) (30) (77) (92)
*
*/

code

    /**
* 节点类
* @param data
* @param left
* @param right
* @constructor
*/
function Node(data,left,right){
this.data = data;
this.right = right;
this.left = left;
this.show = show; function show(){
return this.data;
}
}
//二叉查找树
//保存值原理:相对较小的值保存在左边子节点,较大值保存在右边子节点。
//遍历: 有三种方式:中序,先序,后序。
// 中序, 中序遍历按照节点上的键值,以升序访问BST上的所有节点。
// 先序, 先序遍历先访问根节点,然后以同样方式访问左子树和右子树。
// 后序, 后序遍历先访问叶子节点,从左子树到右子树,再到根节点。
//
/**
* 二叉查找树
* @constructor
*/
function BST(){
var me = this;
me.root = null;
me.inOrder = inOrder;
me.preOrder = preOrder;
me.postOrder = postOrder;
me.insert = insert;
me.getMin = getMin;
me.getMax = getMax;
me.find = find;
me.remove = remove; /**
* 插入 新数据。
* @param data
*/
function insert(data){
var newNode = new Node(data,null,null)
if(me.root == null){
me.root =newNode;
}else{
var cur = me.root,
parent;
while(true){
parent = cur;
//数据小于节点 ==》left
if(data<cur.data){
cur = cur.left;
//如果节点 null 说明该节点下为空。可以插入新数据
if(cur == null){
parent.left = newNode;
break;
}
} else{
//数据大于节点 ==》right
cur = cur.right;
//如果节点 null 说明5节点下为空。可以插入新数据
if(cur==null){
parent.right = newNode;
break;
} }
}
}
} /**
* 中序
* @param node
*/
function inOrder(node,fn){
if(!(node==null)){
me.inOrder(node.left) //中序实现的演示 在这里 将node展示出来
console.log(node.show()+" ");
fn&&fn(node.show())
me.inOrder(node.right)
}
} /**
* 先序
* @param node
* @param fn
*/
function preOrder(node,fn){
if(!(node==null)){
//先序实现的演示,在这里 将node展现出来
console.log(node.show()+" ");
fn&&fn(node)
me.preOrder(node.left)
me.preOrder(node.right)
}
} /**
* 后序
* @param node
* @param fn
*/
function postOrder(node,fn){
if(!(node==null)) {
me.postOrder(node.left);
me.postOrder(node.right); //后序实现的演示,在这里,将node展现
console.log(node.show()+" ");
fn&&fn(node.show())
}
} /**
* 返回最小节点
* @returns {null|*}
*/
function getMin(){
var cur = me.root;
while(!(cur.left==null)){
cur = cur.left;
}
return cur;
} /**
* 返回最大节点
* @returns {null|*}
*/
function getMax(){
var cur = me.root;
while(!(cur.right==null)){
cur = cur.right;
}
return cur;
} /**
* 查找该节点
* @param v
* @returns {*}
*/
function find(v){
var cur = me.root;
while(cur!=null){
if(cur.data == v){
return cur;
}else if(cur.data>v){
cur = cur.left;
}else{
cur = cur.right;
}
}
return null;
} function remove(data){
me.root = removeNode(me.root,data)
} function removeNode(node,data){
if(node ==null)return null; if(data == node.data){
//as
if(node.left==null&&node.right==null){ return null;
}
if(node.left==null){
return node.right;
} if(node.right==null){
return node.left;
}
//当该节点是需要删除的值时(并且该节点下面有子节点)
//那么需要将该节点right上升到该位置 或者 right节点的left节点。
//因为 左边永远小于父节点,右边大于父节点。 var tmp = getSmallest(node.right);
node.data = tmp.data;
node.right = removeNode(node.right,tmp.data)
return node;
}else if(data<node.data){
//left
node.left = removeNode(node.left,data)
return node;
}else{
//right
node.right = removeNode(node.right,data)
return node;
} } function getSmallest(node){
if (node.left == null) {
return node;
}
else {
return getSmallest(node.left);
}
}
}

二叉树的实现 -- 数据结构与算法的javascript描述 第十章的更多相关文章

  1. 检索算法 -- 数据结构与算法的javascript描述 第13章

    检索算法-如何在列表中查找特定的值. 顺序查找 从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,它属于暴力查找技巧的一种,在执行查找时可能会访问到数据结构里的所有元素. 代码: / ...

  2. 散列表的实现 -- 数据结构与算法的javascript描述 第八章

    散列表(哈希表 散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用. 散列表需要一个散列值(key)来存储指定数据,取数据也是依靠此. 散列值可以依靠计算数据的 ASCII码来获得,但是这 ...

  3. 排序算法 -- 数据结构与算法的javascript描述 第12章

    排序是常见的功能,给定一组数据,对其进行排序. 在此之前,我们需要准备个基础工作--自动生成数组,并可以对该组数据做任何处理. /** * 测试类 ,数组 * @param numElements * ...

  4. 集合的实现 -- 数据结构与算法的javascript描述 第九章

    集合 集合(set)是一种包含不同元素的数据结构. 集合中的元素称为成员. 集合的两个最重要特性是:首先,集合中的成员是无序的:其次,集合中不允许相同成员存在. code function Set() ...

  5. 字典 -- 数据结构与算法的javascript描述 第七章

    字典 字典是一种以键-值对形式存储数据的数据结构 最基本功能规划 add 添加数据到字典 remove 从字典中移除数据 get 从字典中取出数据 count 统计字典数据量 find 查找数据在字典 ...

  6. 链表的实现 -- 数据结构与算法的javascript描述 第六章

    链表 链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链 结构示意图 : 链表头需要我们标识 head { element:head,next:obj1 ...

  7. 队列的实现 -- 数据结构与算法的javascript描述 第五章

    队列也是列表的一种,有不同于列表的规则. 先进先出 入队方法 出队方法 可以找到队首 可以找到队尾 可以查看队列有多长 可以查看队列是否为空 这是一个基本的需求,围绕他来实现,当然我们可以自己扩展列表 ...

  8. 栈的实现 -- 数据结构与算法的javascript描述 第四章

    栈 :last-in-first-out 栈有自己特殊的规则,只能 后进入的元素 ,最先被推出来,我们只需要模拟这个规则,实现这个规则就好. peek是返回栈顶元素(最后一个进入的). /** * 栈 ...

  9. 二叉树和二叉查找树--数据结构与算法JavaScript描述(10)

    二叉树和二叉查找树 概念 树是一种非线性的数据结构,以分层的方式存储数据. 树被用来存储具有层级关系的数据,比如文件系统的文件: 树还被用来存储有序列表. 一棵树最上面的节点称为根节点. 如果一个节点 ...

随机推荐

  1. jdk7和8的一些新特性介绍

    jdk7和8的一些新特性介绍 本文是我学习了解了jdk7和jdk8的一些新特性的一些资料,有兴趣的大家可以浏览下下面的内容. 官方文档:http://www.oracle.com/technetwor ...

  2. 【转载】详解java类的生命周期

    原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...

  3. paip.c++ qt 共享库dll的建立

    paip.c++ qt 共享库dll的建立 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/at ...

  4. paip.c++ qt 外部dll共享库的导入以及引用

    paip.c++ qt 外部dll共享库的导入以及引用 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn. ...

  5. 网页平面设计 HTML

    网页平面设计HTML基础 1.网页的基本元素:文字.图像.超链接 2.HTML的基本机构head.title.body三部分 <html> <head> <title&g ...

  6. 在node.js中使用ejs的demo 第五篇

    先说明一下我的项目的目录解构: 本项目中渲染的时候都是通过在index.js页面里面,来使用index.ejs的,首先引用必须的模块: var express = require('express') ...

  7. ORA-04031: 无法分配 共享内存

    今天现场项目oracle系统定时器插入数据报错: --ORA-04031: 无法分配 3936 字节的共享内存 ("shared pool","truncate tabl ...

  8. 指针直接赋值为整型AND利用宏定义求结构体成员偏移量

    首先我们要更正一个很熟悉的概念,那就是指针不仅仅是“地址”,指针还有一个很重要的特性,那就是“类型”. 指针初始化时,“=”的右操作数; 除外,该语句表示指针为空): 所以 ; 这样的代码是不允许的. ...

  9. Linux 学习之网络故障排查

    1.ping www.baidu.com 查看高速有没有修通,如果通,但还不能上网:可能是浏览器.中毒等问题2.ping 网关(10.0.0.254),目的是排除物理链路(网线,网卡,驱动,IP设置等 ...

  10. Android Fragment StartActivityForresult调用实例

    fragment里面的onActivityResult 怎样才能被调用,很简单,就一句话, startActivityForResult(intent, getActivity().RESULT_FI ...