javascript实现二叉查找树
从毕业到入职已经过去了两个月,从现在开始好好学习开始积累自己遇到 的问题写博客做笔记。
最近公司的做后台管理系统其中有vue技术栈的也有react技术栈的,但无论是什么技术栈后台管理系统,我认为最难得点就是权限控制,这其中前端涉及道路静态路由、动态路由设计和生成控制,根据路由表动态生成动态菜单等。我发现无论什么后台项目所涉及到的权限控制数据的数据结构都是树结构,所以萌生了学习一下js版的数据结构,以方便后面的前端生涯,可以更好地处理与树模型相关的业务数据。
- 二叉树,二叉树是一种特殊的树,它的子节点个数不超过两个。二叉树具有一些特殊的计算性质,
使得在它们之上的一些操作异常高效。 - 二叉查找树二叉树的一种特殊形态,所有存储的数据都是有序的。
下面我们分别用javascript ES6之前语法和ES6语法实现二叉查找树:
es5语法:
function Node(data, left, right) {
this.data = data;
this.left = left;
this.right = right;
this.show = show;
}
function show() {
return this.data;
}
function BST() {
this.root = null;
this.insert = insert;
this.inOrder = inOrder;
}
function insert(data) {
var n = new Node(data, null, null);
if (this.root == null) { // 二叉查找树是否为一个新树
this.root = n;
}
else {
var current = this.root;
var parent;
while (true) {
parent = current;
if (data < current.data) {// 一直找到左边合适的位置
current = current.left;
if (current == null) {
parent.left = n;
break;
}
}
else {// 一直找到右边的合适的位置
current = current.right;
if (current == null) {
parent.right = n;
break;
}
}
}
}
}
function inOrder(node) {
if (!(node == null)) {
inOrder(node.left);
console.log(node.show() + " ");
inOrder(node.right);
}
}
es6语法:
class Node {
constructor(data, left, right) {
this.data = data
this.left = left
this.right = right
}
show() {
return this.data
}
}
class BST {
constructor(root = null) {
this.root = null
}
insert(data) {
var n = new Node(data, null, null)
if (this.root === null) {
this.root = n
} else {
var current = this.root
var parent
while (true) {
parent = current
if (data < current.data) {
current = current.left
if(current=null){
parent.left = n
break
}
}else{
current = current.right
if(current=null){
parent.right = n;
break
}
}
}
}
}
inOrder(tree) {
if(!(tree==null)){
this.inOrder(tree.left)
console.log(tree.show())
this.inOrder(tree.right)
}
}
}
const tree = new BST()
tree.insert(1)
tree.insert(7)
tree.insert(3)
tree.insert(2)
tree.insert(4)
tree.insert(5)
tree.insert(8)
tree.insert(9)
tree.insert(0)
tree.inOrder(tree.root)