js數據結構之二叉樹的詳細實現方法
阿新 • • 發佈:2018-08-15
eno data node left 刪除 span pan 先序遍歷 function
數據結構中,二叉樹的使用頻率非常高,這得益於二叉樹優秀的性能。
二叉樹是非線性的數據結構,用以存儲帶有層級的數據,其用於查找的刪除的性能非常高。
二叉樹 數據結構的實現方法如下:
function Node (data, left, right) { this.data = data; this.left = left; this.right = right; this.show = function () { return this.data; }; } function BST () { this.root = null; this.insert = function (data) { var node = new Node(data, null, null); if (this.root === null) { this.root = node; } else { var current = this.root; var parent; while (true) { parent = current;if (data < current.data) { current = current.left; if (current === null) { parent.left = node; break; } } else { current = current.right;if(current === null) { parent.right = node; break; } } } } }; // 中序遍歷 this.inOrder = function (node) { if (node !== null) { this.inOrder(node.left); console.log(node.show()); this.inOrder(node.right); } }; // 先序遍歷 this.preOrder = function (node) { if (node !== null) { console.log(node.show()); this.preOrder(node.left); this.preOrder(node.right); } }; // 後序遍歷 this.afterOrder = function (node) { if (node !== null) { this.afterOrder(node.left); this.afterOrder(node.right); console.log(node.show()); } }; this.getMin = function () { var current = this.root; while (current.left !== null) { current = current.left; } return current.data; }; this.getMax = function () { var current = this.root; while (current.right !== null) { current = current.right; } return current.data; }; this.find = function (data) { var current = this.root; while (current !== null) { if (data < current.data) { current = current.left; } else if (data > current.data) { current = current.right; } else { return current; } } return null; }; this.remove = function (data) { this.root = this._removeNode(this.root, data); //將根節點轉換 }; this._getSmallest = function (node) { while(node.left!=null){ node=node.left; } return node; }; this._removeNode = function (node, data) { if (node === null) { return null; } if (data === node.data) { // 如果沒有子節點 if (node.right === null && node.left === null) { return null; } // 如果沒有左子節點 if (node.left === null) { return node.right;//直接指向其右節點 } // 如果沒有右子節點 if (node.right === null) { return node.left; } // 如果有兩個節點 if (node.right !== null && node.left !== null) { var tempNode = this._getSmallest(node.right); // 找到最小的右節點 node.data = tempNode.data; node.right = this._removeNode(node.right, tempNode.data); // 依次尋找 return node; } } else if (data < node.data){ node.left = this._removeNode(node.left, data); return node; } else { node.right = this._removeNode(node.right, data); return node; } }; }
二叉樹 數據結構的使用方法如下:
var bst = new BST (); bst.insert(40); bst.insert(20); bst.insert(70); bst.insert(60); bst.insert(75); bst.insert(71); bst.insert(73); bst.inOrder(bst.root); bst.remove(70); console.log("----------------"); bst.inOrder(bst.root); console.log("----------------"); console.log(bst.find(73))
js數據結構之二叉樹的詳細實現方法