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

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

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. 我的ACM技能框架(自用)

    每次接触到新的知识就把它名字记下来,留给以后当纪念 2018.11 已经学会的 滚动数组,前缀和优化 对多维数组在空间复杂度上的降维优化     最长上升子序列 LIS问题,动态规划递推解决 最长不下 ...

  2. ORACLE 查看当前用户信息(用户,表视图,索引,表空间,同义词,存储过程,约束条件)

    1.用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select ...

  3. python正则表达式的好文章(转)

    http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html https://blog.csdn.net/shw800/article/det ...

  4. 阻塞套接字返回EAGAIN

    今天用NDK写了一个通信程序,发现阻塞SOKCET 读写的时候返回了EAGAIN.NDK下PERROR输出为Try Again.查了半天头文件 在网上找到了原因.在此纪录.网址为http://blog ...

  5. idea 快捷键设置

    通过 点击放大镜然后按当前需要修改的快捷键找到需要修改的快捷键,更改成希望的快捷键

  6. 【17】AngularJS Bootstrap

    AngularJS Bootstrap AngularJS 的首选样式表是 Twitter Bootstrap, Twitter Bootstrap 是目前最受欢迎的前端框架. Bootstrap 你 ...

  7. POJ 2115 简单的模线性方程求解

    简单的扩展欧几里得题 这里 2^k 不能自作聪明的用 1<<k来写 , k >= 31时就爆int了 , 即使定义为long long 也不能直接这样写 后来老老实实 for(int ...

  8. [luoguP1069] 细胞分裂(数论)

    传送门 分解质因数,不说了 这题坑了我2个多小时 教训 不熟悉位运算的优先级一定要加括号!!!! #include <cstdio> #include <iostream> # ...

  9. Uva122 Trees on the level

    Background Trees are fundamental in many branches of computer science. Current state-of-the art para ...

  10. Spring的发展【一】

    1.1. Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换. ...