1. 程式人生 > >js數據結構之二叉樹的詳細實現方法

js數據結構之二叉樹的詳細實現方法

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數據結構之二叉樹的詳細實現方法