记录学习 Javascript 二叉树
自己也做了一段时间编程了,没有系统学习计算机的相关知识,现在仅凭,对编程的爱好,慢慢前进。
现在算是,有一点能力了。
但是,数据结构,还是有点欠缺的。
还好对于面向对象有点了解,现在就把老师用面向过程写的二叉树,用面向对象重写,毕竟面向对象,是现在,解决问题的有效的方式。
自己也做了一段时间编程了,没有系统学习计算机的相关知识,现在仅凭,对编程的爱好,慢慢前进。
现在算是,有一点能力了。
但是,数据结构,还是有点欠缺的。
还好对于面向对象有点了解,现在就把老师用面向过程写的二叉树,用面向对象重写,毕竟面向对象,是现在,解决问题的有效的方式。
原课程地址: Javascript实现二叉树算法
改用面向对象写出来后发现扩展和使用起来非常方便,比如获取降序升序数组,
生成排序二叉树: var s = new bTree([8,6,2,4,7,5,6,7,9,5,2,3,4]);
获取降序数组: var down = s.down();
获取升序数组:var up = s.up();
面向对象的好处之一,每个节点都会有相应方法,比如这样:
获取父节点 左侧降序: var leftDown = s.left.down();
获取父节点 右侧升序:var rightUp = s.right.up();
还可以这样,获取父节点,左侧节点 的 右侧节点 的升序:
var lrUp = s.left.right.up(); (前提是 你要有那个节点)
这里可以扩展出方法 传入一个获取顺序,这个方法 按照这个顺序在自身上查询排序,如果没有返回空数组或者false;
2018年11月10日 03:13:27
添加 安全获取指定顺序下的排序方式。
function bTree(arr){
if(Array.isArray(arr)){
this.arr = arr;
this._init();
return this;
}
if(!Number.isInteger(arr)){
arr = parseFloat(arr);
if(isNaN(arr)){
return false;
}
}
this.key = arr;
}
bTree.prototype = {
constructor:bTree,
_init(){
if(this.key || !Array.isArray(this.arr)){
return false;
}
this.arr.forEach(function (v, k) {
this._each(v);
}.bind(this));
delete this.arr;
},
_each(value) {
if(!this.key){
this.key = value;
return this;
}
if(this.key > value) {
if(!this.left){
return this._setKey('left', value);
}
return this.left._each(value);
} else if(this.key < value) {
if(!this.right){
return this._setKey('right', value);
}
return this.right._each(value);
}
if(!this.left){
return this._setKey('left', value);
}
if(!this.right){
return this._setKey('right', value);
}
var l = this.left;
this._setKey('left', value);
this.left.left = l;
return this;
},
_setKey(name, value) {
this[name] = new this.constructor(value);
return this;
},
up(ret){
ret = ret || [];
if(this.left){
this.left.up(ret);
}
// console.log(this.key);
ret.push(this.key);
if(this.right){
this.right.up(ret);
}
return ret;
},
down(ret) {
ret = ret || [];
if(this.right){
this.right.down(ret);
}
// console.log(this.key);
ret.push(this.key);
if(this.left){
this.left.down(ret);
}
return ret;
},
getUp() {
var arr = this._parseArg.apply(this, arguments);
var ret = this._parseObj(arr);
if(!ret){
return ret;
}
return ret.up();
},
getDown() {
var arr = this._parseArg.apply(this, arguments);
var ret = this._parseObj(arr);
if(!ret){
return ret;
}
return ret.down();
},
_parseArg() {
var arg = Array.prototype.join.call(arguments, '.');
var r = /([^.]+)+/gi;
var arr = arg.match(r);
return arr;
},
_parseObj (arr) {
if(!Array.isArray(arr)){
return undefined;
}
arr.forEach(function (v, k) {
if(v!=='left' && v!=='right'){
return true;
}
if(!ret[v]){
ret = undefined;
return false;
}
ret = ret[v];
});
return ret;
}
};
var arr = [3,10,1,6,4,7,13,14, 3, 8, 9];
var b = new bTree(arr);



