看到《学习javascript数据结构与算法》这本书上,JS用构造函数生成一颗二叉树,该二叉树的根节点root
属性通过var root = null
作为构造函数的私有属性,这样的话,每个实例就不能直接通过tree.root
访问该二叉树了,如果在构造函数中通过this.root = null
,将它作为实例属性呢,我觉得这样更好啊?
代码如下,主要是定义根节点root时有不同。
function BinarySearchTree () {
function Node(key) {
this.key = key;
this.left = null;
this.right = null
}
//注意看这里,root应该作为实例属性还是构造函数的私有属性
//this.root = null;
var root = null;
function insertNode (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)
}
}
//中序遍历
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)
}
}
//前序遍历
this.preOrderTraverse = function (callback) {
preOrderTraverseNode(root,callback)
}
function preOrderTraverseNode (node, callback) {
if (node !== null) {
callback(node.key);
preOrderTraverseNode(node.left, callback);
preOrderTraverseNode(node.right, callback)
}
}
//后序遍历
this.postOrderTraverse = function (callback) {
postOrderTraverseNode(root,callback)
}
function postOrderTraverseNode (node, callback) {
if (node !== null) {
postOrderTraverseNode(node.left, callback);
postOrderTraverseNode(node.right, callback)
callback(node.key);
}
}
}
粗浅的说几点看法啊: