目录
一、二叉搜索树
二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树
二叉搜索树是一颗二叉树,可以为空;如果不为空,满足以下性质:
- 非空左子树的所有键值小于其根结点的键值。
- 非空右子树的所有键值大于其根结点的键值。
- 左、右子树本身也都是二叉搜索树。
举个例子:下图中第一个不是二叉搜索树,第二三个符合二叉搜索树的特征
二叉搜索树的特点:
相对较小的值总是保存在左结点上,相对较大的值总是保存在右结点上。查找效率非常高,这也是二叉搜索树中“搜索”一词的来源。
二、二叉搜索树的操作及实现
insert(key)
:向树中插入一个新的键。search(key)
:在树中查找一个键,如果结点存在,则返回true
;如果不存在,则返回false
。inOrderTraverse
:通过中序遍历方式遍历所有结点。preOrderTraverse
:通过先序遍历方式遍历所有结点。postOrderTraverse
:通过后序遍历方式遍历所有结点。min
:返回树中最小的值/键。max
:返回树中最大的值/键。remove(key)
:从树中移除某个键。
1.插入数据
//插入数据:对外给用户调用的方法
BinarySerachTree.prototype.insert = function(key){
//1.根据key创建节点
var newNode = new Node(key)
//2.判断根节点是否有值
if(this.root == null){
this.root = newNode
}else{
this.insertNode(this.root,newNode)
}
}
BinarySerachTree.prototype.insertNode = function(node,newNode){
if(newNode.key < node.key){//向左查找
if(node.left == null){
node.left = newNode
}else{
this.insertNode(node.left,newNode)
}
}else{//向右查找
if(node.right == null){
node.right = newNode
}else{
this.insertNode(node.right,newNode)
}
}
}
2.遍历二叉搜索树
此处树的遍历,针对所有的二叉树都是适用的,不仅仅是二叉搜索树。
树的遍历:
遍历一棵树是指访问树的每个结点(也可以对每个结点进行某些操作)。二叉树的遍历常见的有三种方式: 先序遍历、中序遍历、后续遍历。(还有程序遍历, 使用较少, 可以使用队列来完成)