二叉搜索树(Binary Search Tree)
来源:互联网 发布:js获取class对象的值 编辑:程序博客网 时间:2024/05/19 14:17
二叉搜索树,也叫做二叉排序树。这种结构查找元素非常的高效。
在JS里面构建这种结构,有2种方法
1)通过嵌套的对象
2)通过嵌套的数组
下面我们给出嵌套的对象来实现这种结构
/*二叉搜索树,二叉排序树,Binary Search Tree这里我们使用嵌套的对象(nested object)*/function BinarySearchTree() {var Node = function (key) {this.key = key;this.left = null;this.right = null;}var root = null;/*插入节点*/this.insert = function (key) {var new_node = new Node(key);if(root == null) {root = new_node;} else {insertNode(root, new_node);}function insertNode(parent, new_node) {if(parent.key > new_node.key) {if(parent.left == null) {parent.left = new_node;} else {insertNode(parent.left, new_node);}} else {if(parent.right == null) {parent.right = new_node;}else {insertNode(parent.right, new_node);}}}}/* 注意实际上该函数应该是不存在的为了测试方便引入的为了防止对root 节点进行修改。 */this.getRoot = function () {return root;}/*搜索节点使用哪种方法都可以*/// this.search = function (key) {// if(root == null) {// return false;// }// if(root.key == key) {// return true;// }// if(root.key > key) {// return searchTree(root.left);// }// if(root.key < key) {// return searchTree(root.right);// }// function searchTree(parent) {// if(parent == null) {// return false;// }// if(parent.key == key) {// return true;// }// if(parent.key > key) {// return searchTree(parent.left); // 这里需要return// }// if(parent.key < key) {// return searchTree(parent.right);// }// }// } this.search = function (key, parent) {if(parent === null) { // 注意这里需要使用 === ,return false; //因为 undefined == null 显示的是true }var current = parent || root;if(current == null) {return false;}if(current.key == key) {return true;}if(current.key > key) {return this.search(key, current.left);}if(current.key < key) {return this.search(key, current.right);}}/*中序遍历*/this.inOrderTraverse = function () {if(root == null) {return;}inOrderTraverseNode(root.left);console.log(root.key);inOrderTraverseNode(root.right);/* Here is an auxiliary function */function inOrderTraverseNode(parent) {if(parent == null) {return;}inOrderTraverseNode(parent.left);console.log(parent.key);inOrderTraverseNode(parent.right);}}/*前序遍历*/this.preOrderTraverse = function () {if(root == null) {return;}console.log(root.key);preOrderTraverse(root.left);preOrderTraverse(root.right);/*Here is an auxiliary function*/function preOrderTraverse(parent) {if(parent == null) {return;}console.log(parent.key);preOrderTraverse(parent.left);preOrderTraverse(parent.right);}}/*后序遍历*/this.postOrderTraverse = function () {if(root == null) {return;}postOrderTraverseNode(root.left);postOrderTraverseNode(root.right);console.log(root.key);/*Here is an auxiliary function*/function postOrderTraverseNode(parent) {if(parent == null) {return;}postOrderTraverseNode(parent.left);postOrderTraverseNode(parent.right);console.log(parent.key);}}/*返回BST树中的最小值1) 使用递归2)使用循环*/// this.min = function () {// var current = root;// while(current.left != null) {// current = current.left;// }// return current.key;// }this.min = function () {if(root == null) {return;}return minNode(root);function minNode(parent) {if(parent.left == null) {return parent.key;} return minNode(parent.left);}}/*返回BST树中的最大值*/// this.max = function () {// var current = root;// while(current.right != null) {// current = current.right;// }// return current.key;// }this.max = function () {if(root == null) {return;}return maxNode(root);function maxNode(parent) {if(parent.right == null) {return parent.key;}return maxNode(parent.right);} }/*移除树中的节点*/this.remove = function (key) {root = removeNode(root, key);/* Here is an auxiliary function */function removeNode(node, key) {if(node == null) {return null;}if(key < node.key) {node.left = removeNode(node.left, key);return node;} else if(key > node.key) {node.right = removeNode(node.right, key);return node;} else {/*移除的是叶子节点*/if(node.left == null && node.right == null) {node = null;return node;}/*只有一个叶子节点*/if(node.left == null) {node = node.right;return node;} else if(node.right == null) {node = node.left;return node;}/*有两个叶子节点*/var aux = findMinNode(node.right);node.key = aux.key;node.right = removeNode(node.right, aux.key);return node}/*寻找最小的节点*/function findMinNode(node) {if(node == null) {return;}var current = node;while(current.left != null) {current = current.left;}return current;}}}}var arr = [6, 20, 7, 9, 6, 2, 3, 1, 8, 4];var bst = new BinarySearchTree();for(var i=0; i<arr.length; ++i) {bst.insert(arr[i]);}var root = bst.getRoot();console.log(bst.search(6));
阅读全文
1 0
- binary search tree 二叉搜索树
- Binary Search Tree 二叉搜索树 C++
- 二叉搜索树(binary search tree)
- Binary Search Tree 二叉搜索树
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(Binary Search Tree)
- Binary Search Tree(二叉搜索树)
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(binary search tree)
- 二叉搜索树;二叉查找树;二叉排序树;binary search tree
- 二叉搜索树;二叉查找树;二叉排序树;Binary Search Tree
- BST树(Binary Search Tree)二叉搜索树
- 树---Binary Search Tree(二叉搜索树BST)
- uva_10304 - Optimal Binary Search Tree(最优搜索二叉树)
- 数据结构 《5》----二叉搜索树 ( Binary Search Tree )
- cartogarpher slam 4
- 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)
- 【Halcon教程5】 halcon/c++接口基础 之内存管理
- 学习Docker(2017-10-4)
- volatile的详细用法
- 二叉搜索树(Binary Search Tree)
- mybatis报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain
- 【Halcon教程6】halcon/c++接口基础 之异常处理
- hdu 4734(数位dp)
- java之字符串
- HDU 6183 Color it 线段树(动态分配节点)
- Codeforces Round #438 C. Qualification Rounds
- HDOJ2064汉诺塔III
- mysql安装未设置密码 使用root账户登录报错