二叉树:
每个节点最多有2个子节点
二叉搜索树(BST):二叉树的一种
左子树中所有的节点都比跟节点小,右子树所有的节点都比跟节点大
下图:展现了一棵二叉搜索树
算法:
二叉树的实现
class BST{
constructor() {
this.root = null;
}
// 插入
insert(key, value) {
// 如果有根
if(!this.root) {
this.root = new BSTNode(key, value);
} else {
insert(this.root);
}
function insert(node){
if(node.key === key) {
throw new Error ('不能重复')
} else {
// 往右走
if(node.key < key) {
if(!node.right) {
node.right = new BSTNode(key, value);
} else {
// 继续比较
insert(node.right);
}
} else {
// 往左走
if(!node.left) {
node.left = new BSTNode(key, value);
} else {
// 继续比较
insert(node.left);
}
}
}
}
}
// 查询
search(key) {
if(!this.root) {
return undefined;
} else {
return search(this.root);
}
function search(node) {
// 如果node是空节点
if(!node) return undefined;
if(node.key === key) {
return node.value;
} else {
if(node.key < key) {
// 往右查询
return search(node.right);
} else {
// 往左查询
return search(node.left);
}
}
// 最终没找到返回
return undefined;
}
}
}
class BSTNode {
constructor(key, value) {
this.key = key;
this.value = value;
this.left = null;
this.right = null;
}
}
const tree = new BST();
tree.insert(16, 'aa');
tree.insert(2, 'bb');
tree.insert(20, 'cc');
tree.insert(13, 'dd');
tree.insert(8, 'ee');
tree.insert(4, 'ff');
tree.insert(25, 'gg');
console.log(tree.search(20));
console.log(tree);
二叉树 - 遍历
树 - 遍历
1.把所有数据都走一遍
2.数据持久化
树遍历<br /> 深度优先、广度优先
二叉树树遍历<br /> 前序:当前节点 ,left, right<br /> 中序:left, 当前节点, right<br /> 后序: left , right , 当前节点
二叉排序<br /> 1.把数据随机插入<br /> 2.按照“中序遍历“的顺序,把数据重新遍历出来
class BST{
constructor() {
this.root = null;
}
// 插入
insert(key, value) {
// 如果有根
if(!this.root) {
this.root = new BSTNode(key, value);
} else {
insert(this.root);
}
function insert(node){
if(node.key === key) {
throw new Error ('不能重复')
} else {
// 往右走
if(node.key < key) {
if(!node.right) {
node.right = new BSTNode(key, value);
} else {
// 继续比较
insert(node.right);
}
} else {
// 往左走
if(!node.left) {
node.left = new BSTNode(key, value);
} else {
// 继续比较
insert(node.left);
}
}
}
}
}
// 查询
search(key) {
if(!this.root) {
return undefined;
} else {
return search(this.root);
}
function search(node) {
// 如果node是空节点
if(!node) return undefined;
if(node.key === key) {
return node.value;
} else {
if(node.key < key) {
// 往右查询
return search(node.right);
} else {
// 往左查询
return search(node.left);
}
}
// 最终没找到返回
return undefined;
}
}
// 中序遍历 left, 当前节点, right,遍历后数据
walk(fn){
if(!this.root) {
return;
} else {
return walk(this.root);
}
function walk(node) {
if(!node) return;
else {
walk(node.left);
fn(node);
walk(node.right)
}
}
}
}
class BSTNode {
constructor(key, value) {
this.key = key;
this.value = value;
this.left = null;
this.right = null;
}
}
const tree = new BST();
// 随机插入
tree.insert(16, 'aa');
tree.insert(2, 'bb');
tree.insert(20, 'cc');
tree.insert(13, 'dd');
tree.insert(8, 'ee');
tree.insert(4, 'ff');
tree.insert(25, 'gg');
tree.insert(3, 'hh');
tree.insert(45, 'hh');
tree.insert(23, 'hh');
tree.insert(18, 'hh');
console.log(tree);
// 遍历
tree.walk(node => console.log(node.key, node.value));