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

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

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. 随机数生成工具类(中文姓名,性别,Email,手机号,住址)

    public class RandomValueUtil { public static String base = "abcdefghijklmnopqrstuvwxyz012345678 ...

  2. 洛谷 2866 [USACO06NOV]糟糕的一天Bad Hair Day

    [题意概述] 给出一个长度为n的序列a,求有多少对[i,j]满足i<j且a[i]>max(a[i+1],a[i+2],...,a[j]). [题解] 单调栈. 倒着处理序列的元素,维护一个 ...

  3. ds020507

    芯片输出端不加负载的时候,芯片的输出电压是9点多伏. 加上大的负载,芯片发热,电压接近输入电压. 正常负载,芯片输出7.0几伏. 版权声明:本文为博主原创文章,未经博主允许不得转载.

  4. JavaSE 学习笔记之反射技术(二十四)

    反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好 ...

  5. idea结合git版本控制

    IntelliJ-IDEA和Git.GitHub.Gitlab的使用(五)----https://blog.csdn.net/milsevol/article/details/72792468

  6. PM2 & chmod +x

    PM2 https://www.npmjs.com/package/pm2 https://github.com/Unitech/pm2 docs https://pm2.io/doc/en/runt ...

  7. vue.js中的路由vue-router2.0使用

    在我们平时工作中,我们有时候会有需求,按照不同的规则,加载不同的组件,页面不去跳转,常见的操作是ajax的异步操作,实现局部刷新加载新数据 在vue中,我们写了很多不同的组件,这时候,实现不刷新调用新 ...

  8. Linux下清除DNS缓存

    通常有的时候我们通过域名打不开网页,有可能使DNS缓存的原因(DNS解析的ip地址变了),解决办法如下: 方法一:$nslookup ecafe.pub(这里是你要打开的域名) 方法二:$sudo / ...

  9. cogs——1298. 通讯问题

    1298. 通讯问题 ★★   输入文件:jdltt.in   输出文件:jdltt.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...

  10. 基于.NET平台常用的框架整理(转)

    基于.NET平台常用的框架整理   分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问 ...