中序遍历是一种以上行顺序访问二叉树所有节点的遍历方式,也就是从小到大的顺序。inOrderTraverse方法接收一个回调函数作为参数,用递归的方式遍历。
先序遍历-------首先检查以参数形式传入的节点是否为null(--这是停止递归继续执行的判断条件--),然后,递归调用相同的函数来访问左侧子节点。接着对这个节点进行一些操作(callback方法),然后在访问右侧子节点。
中序遍历-------与先序遍历不同的是,执行顺序是先访问节点本身,然后访问它的左侧子节点,最后是右侧子节点。
function BinarySearchTree() {
var Node = function (key) {
this.key = key;
this.left = null;
this.right = null;
};
//根节点
var root = null;
var 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.insert = function (key) {
var newNode = new Node(key)
if(root == null){
root = newNode
} else {
insertNode(root, newNode)
}
}
//中序遍历
var inOrderTraverseNode = function (node, callback) {
if(node !== null){
inOrderTraverseNode(node.left, callback);
callback(node.key)
inOrderTraverseNode(node.right, callback)
}
}
//中序遍历
this.inOrderTraverse = function (callback) {
inOrderTraverseNode(root,callback)
}
//先序遍历
var preOrderTraverseNode = function (node, callback) {
if(node !== null){
callback(node.key)
preOrderTraverseNode(node.left, callback);
preOrderTraverseNode(node.right, callback)
}
}
//先序遍历
this.preOrderTraverse = function (callback) {
preOrderTraverseNode(root,callback)
}
//后序遍历
var postOrderTraverseNode = function (node, callback) {
if(node !== null){
postOrderTraverseNode(node.left, callback);
postOrderTraverseNode(node.right, callback);
callback(node.key)
}
}
//后序遍历
this.postOrderTraverse = function (callback) {
postOrderTraverseNode(root,callback)
}
}
var 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);
tree.insert(6);
function printNode(val) {
console.log(val);
}
tree.inOrderTraverse(printNode)