class Node { constructor(key) { this.key = key; this.left = null; this.right = null; } } class BstSearch { constructor() { this.root = null; } insert(key) { var newNode = new Node(key); const inserNode = (node, newNode) => { if (newNode.key < node.key) { if (node.left == null) { node.left = newNode; } else { inserNode(node.left, newNode); } } else { if (node.right == null) { node.right = newNode; } else { inserNode(node.right, newNode); } } }; if (!this.root) { this.root=newNode; } else{ inserNode(this.root,newNode); } } //中序遍历,从做小到最大访问,左跟又 inOrderTraverse(callback){ const inOrderTraverseNOde=(node,callback)=>{ if(node!=null){ inOrderTraverseNOde(node.left,callback); callback(node.key); inOrderTraverseNOde(node.right,callback); } }; inOrderTraverseNOde(this.root,callback); } //先序遍历,跟左右 preOrderTraverse(callback){ const preOrderTraverseNode=(node,callback)=>{ if(node){ callback(node.key); preOrderTraverseNode(node.left,callback); preOrderTraverseNode(node.right,callback) } }; preOrderTraverseNode(this.root,callback); } //后序遍历,左右根 postOrderTraverse(callback){ const postOrderTraverseNode=(node,callback)=>{ if(node){ postOrderTraverseNode(node.left,callback); postOrderTraverseNode(node.right,callback); callback(node.key); } }; postOrderTraverseNode(this.root,callback); } //最小值 min(node){ const minNode=(node)=>{return node ?(node.left?minNode(node.left):node):null}; return minNode(node||this.root); } //最大值 max(node){ const maxNode=(node)=>{return node?(node.right?maxNode(node.right):node):null}; return maxNode(node||this.root); } //搜索特定值 search(value){ const searchNode=(node,value)=>{ if(node){ if(node.key==value) return node; else if(node.key<value && node.right){ return searchNode(node.right,value); } else if(node.key>value && node.left){ return searchNode(node.left,value); } } else{ return null; } }; return searchNode(this.root,value); } //删除 //如果是页面节点,直接删除 //如果非页面节点 // 有right,那么将right的最小值替换该节点,删除最小节点 // 没有right,那么找left的right的最小值替换该节点,删除最小节点 Remove(value){ const RemoveNode=(node,value)=>{ debugger; if(!node) return false; if(node.key==value){ if(node.left===null && node.right===null){ let n=node; node=null; return n; } else if( node.right){ let n=this.min(node.right); node.key=n.key; return RemoveNode(node.right,n.key); } else if(node.left){ let n=this.min(node.left); node.key=n.key; return RemoveNode(node.left,n.key); } } else if(node.key<value && node.right){ return RemoveNode(node.right,value); } else if(node.key>value && node.left){ return RemoveNode(node.left,value); } }; return RemoveNode(this.root,value); } } var bst=new BstSearch(); bst.insert(11); bst.insert(7); bst.insert(5); bst.insert(3); bst.insert(9); bst.insert(8); bst.insert(10); bst.insert(13); bst.insert(12); bst.insert(14); bst.insert(20); bst.insert(18); bst.insert(25);