树的定义
二叉树
二叉树中的节点最多只能有两个节点,一个左侧节点,一个右侧节点。
二叉搜索树(BST)
二叉搜索树是二叉树的一种,只允许左侧节点小于右侧节点
创建二叉搜索树
function BinarySearchTree(){
let Node=function(key){//创建节点
this.key=key
this.left=null
this.right=null
}
let root=null
}
插入节点
步骤1:创建新的节点
步骤2:验证插入操作是否为特殊操作。判断插入的是否为树的第一个节点
步骤3:将节点加在非根节点的其他位置
// 插入一个新节点(键值)
this.insert=function(key){
let newNode=new Node(key)
if(root===null){
root=newNode
}else{
insertNode(root,newNode)
}
}
let insertNode=function(node,newNode){
if(newNode.key<node.key){ //插入左边
if(node.left===null){
node.left=newNode
}else{
insertNode(node.left,newNode)
}
}else{//插入右边
if(node.right===null){
node.right=newNode
}else{
insertNode(node.right,newNode)
}
}
}
中序遍历
this.inOrderTraver = function(callback){
inOrderTraverNode(root,callback)
}
let inOrderTraverNode=function(node,callback){
if(node!==null){
inOrderTraverNode(node.left,callback)
callback(node.key)
inOrderTraverNode(node.right,callback)
}
}
前序遍历
this.preOrderTraverse = function(callback){
preOrderTraverseNode(root,callback)
}
let preOrderTraverseNode = function(node,callback){
if(node !==null){
callback(node.key)
preOrderTraverseNode(node.left,callback)
preOrderTraverseNode(node.right,callback)
}
}
后序遍历
this.postOrderTraverse = function(callback){
postOrderTraverseNode(root,callback)
}
let postOrderTraverseNode = function(node,callback){
if(node !==null){
postOrderTraverseNode(node.left,callback)
postOrderTraverseNode(node.right,callback)
callback(node.key)
}
}
打印节点值
function print(value){
console.log(value)
}
测试
let tree=new BinarySearchTree()
tree.insert(11)
tree.insert(7)
tree.insert(15)
tree.insert(5)
tree.insert(3)
tree.insert(9)
tree.insert(8)
tree.insert(10)
tree.insert(13)
tree.insert(12)
tree.insert(14)
tree.insert(20)
tree.insert(18)
tree.insert(25)
console.log(tree)
tree.inOrderTraver(print)
//3 5 7 8 9 10 11 12 13 14 15 18 20 25
console.log('————————————')
tree.preOrderTraverse(print)
//11 7 5 3 9 8 10 15 13 12 14 20 18 25
console.log('————————————')
tree.postOrderTraverse(print)
//3 5 8 10 9 7 12 14 13 18 25 20 15 11