二叉树是一种特殊的树,它的子节点个数不超过两个。二叉树具备一些特殊的计算性质, 使得在它们之上的一些操做异常高效。node
当考虑某种特殊的二叉树,好比二叉查找树时,肯定子节点很是重要。二叉查找树是一种 特殊的二叉树,相对较小的值保存在左节点中,较大的值保存在右节点中。这一特性使得 查找的效率很高,对于数值型和非数值型的数据,好比单词和字符串,都是如此。bash
二叉树由节点组成,因此咱们先定义Node
类,和链表相似:数据结构
function Node(data){
this.data = data
this.left = left
this.right = right
this.show = () => this.data
}
复制代码
一个二叉树的类,初始化的root
为null
:post
function BST (){
this.root = null
this.insert = insert
this.inOrder = inOrder //中序遍历
}
复制代码
二叉树的node
插入要符合的规则:ui
function insert(data){
let newNode = new Node(data)
if(this.root === null){
this.root = newNode //第一次插入的节点替换掉了初始的root
}else{
let currNode = this.root
let parent
while(true){
parent = currNode
if(data<currNode.data){
currNode = currNode.left
if(currNode===null){
parent.left = newNode
break
}
}else{
currNode = currnNode.right
if(currNode===null){
parent.right = newNode
break
}
}
}
}
}
复制代码
另外,因为树并非线性数据结构,因此它的遍历形式也能够分为三种,分别是this
首先看什么是中序遍历,中序遍历按照节点上的键值,以升序访问BST 上的全部节点, 结合前面说的,相对较小的值保存在左节点中,较大的值保存在右节点中,咱们能够知道中序遍历是先访问最左的叶子节点,而后访问该叶子节点的父节点,再访问该父节点的右叶子节点....遍历的结果是按树全部节点的值从小到大依次排列的。spa
中序遍历顺序以下:code
function inOrder (node){
if (!(node==null)){
inOrder(node.left)
console.log(node.show()+"") //+""会打印出一个字符串
inOrder(node.right)
}
}
复制代码
先序遍历的顺序以下:cdn
function preOrder (node){
if(!(node==null)){
console.log(node.show())
preOrder(node.left)
preOrder(node.right)
}
}
复制代码
后序遍历的顺序以下:blog
function postOrder (node){
if(!(node==null)){
postOrder(node.left)
postOrder(node.right)
console.log(node.show())
}
}
复制代码
二分法查找二叉树上给定的值:
function find(data){
let currNode = this.root
while(currNode!=null){
if(currNode.data===data){
return currNode
}
else if(currNode.data>data){
currNode = currNode.left
}
else{
currNode = currNode.right
}
}
return null
}
复制代码