用 js 实现的二叉树数据结构,完成 先/中/后 序遍历、查找最 大/小 值、查找特定值以及删除节点(虽然没太理解)的操作。
// 节点对象 class Node { constructor(data) { this.root = this; this.data = data; this.left = null; this.right = null; } } // 二叉树 class BST { constructor() { this.root = null; } // 插入节点 insert(data) { let newNode = new Node(data); let insertNode = (node, newNode) => { if (newNode.data < node.data) { 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) } } }; if (!this.root) { this.root = newNode; } else { insertNode(this.root, newNode) } } /* 中序遍历 => 1.访问左子树(先访问左子树中的左子树,再访问左子树中的右子树); 2.访问根 3.访问右子树(先访问右子树中的左子树,再访问右子树中的右子树) 可以起到排序作用 */ inOrder() { let backs = []; let inOrderNode = (node, callback) => { if (node !== null) { inOrderNode(node.left, callback); backs.push(callback(node.data)); inOrderNode(node.right, callback); } } let callback = function(v) { return v } inOrderNode(this.root, callback); return backs } // 前序遍历 => 1.访问根节点; 2.访问左子树; 3.访问右子树 preOrder() { let backs = []; let preOrderNode = (node, callback) => { if (node !== null) { backs.push(callback(node.data)); preOrderNode(node.left, callback); preOrderNode(node.right, callback); } } let callback = function(v) { return v } preOrderNode(this.root, callback); return backs } /* 后序遍历 => 1.访问左子树。(先访问左子树中的左子树,再访问左子树中的右子树) 2.访问右子树。(先访问右子树中的左子树,再访问右子树中的右子树) 3.访问根 */ postOrder(){ let backs = []; const postOrderNode = (node,callback) => { if(node !== null){ postOrderNode(node.left,callback); postOrderNode(node.right,callback); backs.push(callback(node.data)) } }; let callback = function(v) { return v } postOrderNode(this.root,callback); return backs } // 查找最小值 getMin(node) { let minNode = node => { return node ? (node.left ? minNode(node.left) : node) : null } return minNode(node || this.root) } // 查找最大值 getMax(node) { let maxNode = node => { return node ? (node.right ? maxNode(node.right) : node) : null } return maxNode(node || this.root) } // 查找特定值 find(data) { let findNode = (node, data) => { if (node == null) return false if (node.data === data) return node; return findNode((data < node.data) ? node.left : node.right, data); } return findNode(this.root, data); } // 删除节点 // 返回新的二叉树? remove(data) { let removeNode = (node, data) => { if (node === null) return null; if (node.data === data) { if (node.left === null && node.right === null) return null if (node.left === null) return node.right; if (node.right === null) return node.left; if (node.left !== null && node.right !== null) { let _node = this.getMin(node.right); node.data = _node.data; node.right = removeNode(node.right, data); return node } } else if (data < node.data) { node.left = removeNode(node.left, data); return node; } else { node.right = removeNode(node.right, data); return node; } } return removeNode(this.root, data) } } /***********************************/ // some operation let datas = [11,7,5,3,6,9,8,10,20,14,12,25,18]; let bst = new BST(); datas.forEach(data => { bst.insert(data) }) console.log(bst.getMax()) console.log(bst.getMin())
原文:https://www.cnblogs.com/cc-freiheit/p/10368078.html