美文网首页
2020-06-15二叉搜索树(BST)

2020-06-15二叉搜索树(BST)

作者: itsmyturn | 来源:发表于2020-06-15 09:57 被阅读0次
    function BinarySearchTree(){
      let Node=function(key){
        this.key=key
        this.left=null
        this.right=null
      }
      let root=null
      this.insert=function(key){
        let insertNode=function(node,newNode){
          if(newNode.key<node.key){
            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)
            }
          }
        }
        let newNode=new Node(key)
        if(root===null){
          root=newNode
        }else{
          insertNode(root,newNode)
        }
      }
      //中序遍历
      let inOrderTraverseNode=function(node,callback){
        if(node!==null){
          inOrderTraverseNode(node.left,callback)
          callback(node.key)
          inOrderTraverseNode(node.right,callback)
        }
      }
      this.inOrderTraverse=function(callback){
        inOrderTraverseNode(root,callback)
      }
      //先序遍历
      let preOrderTraverseNode=function(node,callback){
        if(node!==null){
          callback(node.key)
          preOrderTraverseNode(node.left,callback)
          preOrderTraverseNode(node.right,callback)
        }
      }
      this.preOrderTraverse=function(callback){
        preOrderTraverseNode(root,callback)
      }
      //后序遍历
      let postOrderTraverseNode=function(node,callback){
        if(node!==null){
          
          postOrderTraverseNode(node.left,callback)
          postOrderTraverseNode(node.right,callback)
          callback(node.key)
        }
      }
      this.postOrderTraverse=function(callback){
        postOrderTraverseNode(root,callback)
      }
      //最小值
      let minNode=function(node){
        if(node){
          while(node&&node.left!==null){
            node=node.left
          }
          return node.key
        }
        return null
      }
      this.min=function(){
        return minNode(root)
      }
      //最大值
      let maxNode=function(node){
        if(node){
          while(node&&node.right!==null){
            node=node.right
          }
          return node.key
        }
        return node
      }
      this.max=function(){
        return maxNode(root)
      }
      //搜索特定值
      let searchNode=function(node,key){
        if(node===null){
          return false
        }
        if(key<node.key){
          return searchNode(node.left,key)
        }else if(key>node.key){
          return searchNode(node.right,key)
        }else{
          return true
        }
      }
      this.search=function(key){
        return searchNode(root,key)
      }
      let findMinNode=function(node){
        if(node){
          while(node&&node.left!==null){
            node=node.left
          }
          return node
        }
        return null
      }
      let removeNode=function(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
          }
          //有两个子节点
          let aux=findMinNode(node.right)
          node.key=aux.key
          node.right=removeNode(node.right,aux.key)
          return node
        }
      }
      //删除某个节点
      this.remove=function(key){
        root=removeNode(root,key)
      }
    
      
    }
    let tree=new BinarySearchTree()
    tree.insert(11)
    tree.insert(7)
    tree.insert(15)
    tree.insert(5)
    tree.insert(3)
    tree.insert(9)
    tree.insert(8)
    tree.insert(10)
    tree.insert(13)
    tree.insert(12)
    tree.insert(14)
    tree.insert(20)
    tree.insert(18)
    tree.insert(25)
    tree.insert(6)
    function printNode(value){
      console.log(value)
    }
    //tree.inOrderTraverse(printNode)//3,5,6,7,8,9,10,11,12,13,14,15,18,20,25
    //tree.preOrderTraverse(printNode)//11,7,5,3,6,9,8,10,15,13,12,14,20,18,25
    // tree.postOrderTraverse(printNode)//3,6,5,8,10,9,7,12,14,13,18,25,20,15,11
    // console.log(tree.min())//3
    // console.log(tree.max())//25
    // console.log(tree.search(1))//false
    console.log(tree.search(8))//true
    tree.remove(8)
    console.log(tree.search(8))//false
    tree.remove(15)
    console.log(tree.search(15))//false
    
    

    相关文章

      网友评论

          本文标题:2020-06-15二叉搜索树(BST)

          本文链接:https://www.haomeiwen.com/subject/qhhcxktx.html