如图的所示,一棵二叉树,从树的跟节点开始遍历,如果左子节点存在先遍历左子节点或者左子树,如果不存在了则先打印左子节点,再返回,打印父节点,再遍历此节点的右子节点或者右子树。
依次来看,对于图上的这颗二叉树,会打印输出:1,3,4,6,7,8,10,13,14这样的升序排列。
在之前的代码上进行改造。主要添加了inOrderTraverse,inOrderTraverseNode这两个方法。
function BinaryTree(){
// 根节点
let root = null
function Node (key){
this.key = key;
this.left = null;
this.right = null;
}
function insertNode(node, newNode){
// 判断新节点和跟节点的大小
if(node.key > newNode.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.insert = function(key){
let node = new Node(key)
if(!root){
root = node
}else{
insertNode(root,node)
}
}
// 中序排序
this.inOrderTraverse = function(callback){
inOrderTraverseNode(root,callback)
}
function inOrderTraverseNode(node, callback){
if(node !== null){
// 遍历左子节点
inOrderTraverseNode(node.left,callback)
// 输出值
callback(node.key)
// 遍历右子节点
inOrderTraverseNode(node.right,callback)
}
}
}
let arr = [8,3,10,1,6,14,4,7,13]
let binaryTree = new BinaryTree()
arr.forEach(elt=>{
binaryTree.insert(elt)
})
function dealCallBack (key){
console.log(key)
}
binaryTree.inOrderTraverse(dealCallBack)