二叉搜索树:顾名思义,树上每个节点最多只有二根分叉;而且左分叉节点的值 < 右分叉节点的值 。

特点:插入节点、找最大/最小节点、节点值排序 非常方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
二叉搜索树-javascript实现
<script type="text/javascript">// <![CDATA[
    //打印输出
    function println(msg) {
        document.write(msg + " ");
    }
 
    //节点类
    var Node = function (v) {
        this.data = v; //节点值
        this.left = null//左节点
        this.right = null//右节点
    }
 
    //二叉搜索树类
    var BinarySearchTree = function () {
        this.root = null//初始化时,根节点为空
        //插入节点
        //参数:v 为节点的值
        this.insert = function (v) {
            var newNode = new Node(v);
            if (this.root == null) {
                //树为空时,新节点,直接成为根节点
                this.root = newNode;
                return;
            }
            var currentNode = this.root; //工作“指针”节点(从根开始向下找)
            var parentNode = null;
            while (true) {
                parentNode = currentNode;
                if (v < currentNode.data) {
                    //当前节点的值 > 目标节点的值                   
                    //应该向左插,工作节点移到左节点
                    currentNode = currentNode.left;
                    if (currentNode == null) {
                        //没有左节点,则新节点,直接成为左节点
                        parentNode.left = newNode;
                        return//退出循环
                    }
                }
                else {
                    //否则向右插,工作节点移到右节点
                    currentNode = currentNode.right;
                    if (currentNode == null) {
                        parentNode.right = newNode;
                        return;
                    }
                }
 
            }
        }
 
        //查找最小节点
        this.min = function () {
            var p = this.root; //工作节点  
            while (p != null && p.left != null) {
                p = p.left;
            }
            return p;
        }
 
        //查找最大节点
        this.max = function () {
            var p = this.root; //工作节点  
            while (p != null && p.right != null) {
                p = p.right;
            }
            return p;
        }
 
        //中序遍历
        this.inOrder = function (rootNode) {
            if (rootNode != null) {
                this.inOrder(rootNode.left); //先左节点
                println(rootNode.data); //再根节点
                this.inOrder(rootNode.right); //再右节点
            }
        }
 
        //先序遍历
        this.preOrder = function (rootNode) {
            if (rootNode != null) {
                println(rootNode.data); //先根
                this.preOrder(rootNode.left); //再左节点
                this.preOrder(rootNode.right); //再右节点
            }
        }
 
        //后序遍历
        this.postOrder = function (rootNode) {
            if (rootNode != null) {
                this.postOrder(rootNode.left); //先左节点
                this.postOrder(rootNode.right); //再右节点
                println(rootNode.data); //再根节点
            }
        }
    }
 
 
    //以下是测试
    var bTree = new BinarySearchTree();
    //《沙特.算法设计技巧与分析》书上图3.9 左侧的树
    
    bTree.insert(6);
    bTree.insert(3);
    bTree.insert(8);
    bTree.insert(1);
    bTree.insert(4);
    bTree.insert(9);
    
    println('中序遍历:')
    bTree.inOrder(bTree.root);
 
    println("<br/>");
 
    println("先序遍历:");
    bTree.preOrder(bTree.root);
 
    println("<br/>");
 
    println("后序遍历:");
    bTree.postOrder(bTree.root);
 
    println("<br/>");
    var minNode = bTree.min();
    println("最小节点:" + (minNode == null "不存在" : minNode.data));
 
    println("<br/>");
    var maxNode = bTree.max();
    println("最大节点:" + (maxNode == null "不存在" : maxNode.data));
// ]]></script>中序遍历: 1 3 4 6 8 9 <br> 先序遍历: 6 3 1 4 8 9 <br> 后序遍历: 1 4 3 9 8 6 <br> 最小节点:1 <br> 最大节点:9

输出结果:

中序遍历: 1 3 4 6 8 9 
先序遍历: 6 3 1 4 8 9 
后序遍历: 1 4 3 9 8 6 
最小节点:1 
最大节点:9

转自http://www.cnblogs.com/yjmyzz/archive/2013/05/19/3087832.html

js 二叉搜索树的更多相关文章

  1. 数据结构-二叉搜索树的js实现

    一.树的相关概念 1.基本概念 子树 一个子树由一个节点和它的后代构成. 节点的度 节点所拥有的子树的个数. 树的度 树中各节点度的最大值 节点的深度 节点的深度等于祖先节点的数量 树的高度 树的高度 ...

  2. 用js刷剑指offer(二叉搜索树与双向链表)

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 牛客网链接 js代码 /* function TreeNode(x) { ...

  3. 用js刷剑指offer(二叉搜索树的后序遍历序列)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 牛客网链接 js代码 function Verif ...

  4. JS递归及二叉搜索树的移除节点

    1递归含义:在某时某刻某个条件下调用包含自己的函数 2:注意点:⑴递归过程中一定要加限制条件,要不然会陷入死循环: 死循环eg: function f(someP){ f(somP); } f(4); ...

  5. js实现输入某串数字,构建完全二叉树,并判断是否为二叉搜索树

    思路:若为二叉搜索树,则中序遍历为递增的 let arr = [15,8,16,6,10];let pindex = [];function Node(){ this.root = null; thi ...

  6. 原生JS实现二叉搜索树(Binary Search Tree)

    1.简述 二叉搜索树树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子 ...

  7. 使用php实现二叉搜索树

    看到一位大神写的js的搜索树,自己也按照模式写了一个php的二叉搜索树. <?phpclass node{ public $data; public $key; public $left=nul ...

  8. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  9. [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

随机推荐

  1. 剑指offer---正则表达式匹配

    题目:正则表达式匹配 要求:请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所 ...

  2. linux nethogs-终端下的网络流量监控工具

    推荐:更多linux 性能监测与优化 关注:linux命令大全 有很多适用于Linux系统的开源网络监视工具.比如说,你可以用命令iftop来检查带宽使用情况.netstat用来查看接口统计报告,还有 ...

  3. 使用Postman Interceptor发送带cookie的请求一直loading的解决法案

    很多web网页开发人员都知道Postman限制由于chrome安全的限制,发不出带cookie和带有自定义头部标签的请求.想要发出由于chrome安全的限制,发不出带cookie和带有自定义头部标签的 ...

  4. 将登录代码模块化,然后用add address接口来调用它,success!

    登录模块,单独写成mylogin()方法,保存为modeltry119.py,然后接口的文件只写接口, 在post请求时,引用mylogin()返回的cookies就好了. requests.post ...

  5. visioStudio常见问题

    问题一: 在做项目时候,使用VisioStudio 2008,一不小心将设置恢复到了原始,一直找不到需要的东西. 比如生成方式“debug”和“Release”选择框没有.一些图标也没有. 经过不断的 ...

  6. 《阿里巴巴Java开发手册》更新为《Java开发手册》

    新版一览:华山版<Java开发手册> <阿里巴巴Java开发手册>始于阿里内部规约,在全球Java开发者共同努力下,已成为业界普遍遵循的开发规范,涵盖编程规约.异常日志.单元测 ...

  7. mongodb数据库的一些常用命令列表

    超级用户相关:use admin #增加或修改用户密码db.addUser(ixigua,'pwd') #查看用户列表db.system.users.find() #用户认证db.auth(ixigu ...

  8. spring历史地址

    http://repo.spring.io/release/org/springframework/spring/

  9. 高数A(下)第九章

    第九章 空间解析几何 9.2 9.3 9.4 自测题

  10. Linux服务管理(Ubuntu服务管理工具sysv-rc-conf)(转)

    Linux运行级别 Linux系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和要达到的目的都不同,系统可以在这些运行级之间进行切换,以完成不同的工作. 运行 ...