二叉树:
每个节点最多有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));
