二叉树

作者: coolheadedY | 来源:发表于2017-09-18 22:29 被阅读13次

    二叉树

    class Node { // Node有左右区分,本身值
      constructor (data, right = null, left = null) {
        this.data = data
        this.right = right
        this.left = left
      }
    }
    
    class BST {
      constructor () {
        this.root = null // bst的起始顶部是null
      }
    
      add (data) {
        const node = this.root
        if (node === null) {
          this.root = new Node(data) // 如果没有root node,那就创建这个这个root new Node
          return '创建rootNode'
        } else { // 如果不是顶部节点,创建递归函数找到它在哪
          const searchTree = function (node) { // 递归
            if (data < node.data) { // 如果添加值小于当前节点的值,那它应该从左搜索
              if (node.left === null) { // 如果节点left是空,添加值就为节点left
                node.left = new Node(data)
                return '创建lfetNode'
              } else if (node.left !== null) {
                return searchTree(node.left)
              }
            } else if (data > node.data) {
              if (node.right === null) {
                node.right = new Node(data)
                return '创建rightNode'
              } else if (node.right !== null) {
                return searchTree(node.right)
              }
            } else {
              return null // 相等责不再增加
            }
          }
          return searchTree(node)
        }
      }
    
      findMin () { // 最小的为最左边的
        let current = this.root
        while (current.left !== null) {
          current = current.left
        }
        return current.data
      }
    
      findMax () {
        let current = this.root
        while (current.right !== null) {
          current = current.right
        }
        return current.data
      }
    
      find (data) {
        let current = this.root
        while (current.data !== data) {
          if (data < current.data) current = current.left
          if (data > current.data) current = current.right
          if (current === null) return null // ?
        }
        return current
      }
    
      isPresent (data) {
        let current = this.root
        while (current) {
          if (data === current.data) return true
          if (data < current.data) current = current.left
          if (data > current.data) current = current.right
        }
        return false
      }
    
      remove (data) {
        const removeNode = function (node, data) {
          if (node === null) return null
          if (data === node.data) {
            // node 没有子节点
            if (node.left === null && node.right === null) return null
            // node 没有left
            if (node.left === null) return node.right
            // node 没有right
            if (node.right === null) return node.left
            // node 有两个节点
            let tempNode = node.right
            while (tempNode.left !== null) { // 替换最接近当前需删除的节点 比如当前5 左边1 右边9,那么9的left会是 9 8 7 6, 1的right会是 2, 3, 4
              tempNode = tempNode.left
            }
            node.data = tempNode.data
            node.right = removeNode(node.right, tempNode.data) // 从right开始找到替换的节点位置进行删除,对它的子节点进行替换,直到替换为无子节点的情况
            return node
          } else if (data < node.data) { // 如果data小于当前值,从左边查找并删除
            node.left = removeNode(node.left, data)
            return node
          } else if (data > node.data) {
            node.right = removeNode(node.right, data)
            return node
          }
        }
        removeNode(this.root, data)
      }
    
      isBalanced () {
        return (this.heightFromMin() >= this.heightFromMax() - 1) // 从两边计算,只要其中一边算都高度 >= 另一边 - 1 那么就算均衡的
      }
    
      heightFromMin (node = this.root) { // 从最左边最小值开始计算高度
        if (node === null) return -1 // 先确定到最末尾都节点
        let left = this.heightFromMin(node.left)
        let right = this.heightFromMin(node.right)
        if (left < right) return left + 1 // 从left最小值开始计算高度
        else return right + 1
      }
    
      heightFromMax (node = this.root) {
        if (node === null) return -1
        let left = this.heightFromMax(node.left)
        let right = this.heightFromMax(node.right)
        if (left < right) return right + 1 // 从right最大值开始计算高度
        else return left + 1
      }
    
      inOrder () { // 中序遍历
        if (this.root === null) return null
        else {
          const result = []
          const traverseInOrder = function (node) {
            node.left && traverseInOrder(node.left)
            result.push(node.data)
            node.right && traverseInOrder(node.right)
          }
          traverseInOrder(this.root)
          return result
        }
      }
    
      preOrder () { // 前序遍历
        if (this.root === null) return null
        else {
          const result = []
          const traversePreOrder = function (node) {
            result.push(node.data)
            node.left && traversePreOrder(node.left)
            node.right && traversePreOrder(node.right)
          }
          traversePreOrder(this.root)
          return result
        }
      }
    
      postOrder () { // 后序遍历
        if (this.root === null) return null
        else {
          const result = []
          const traversePostOrder = function (node) {
            node.left && traversePostOrder(node.left)
            node.right && traversePostOrder(node.right)
            result.push(node.data)
          }
          traversePostOrder(this.root)
          return result
        }
      }
    
      levelOrder () { // 按层次遍历
        let result = []
        let queue = []
        if (this.root === null) return null
        else {
          queue.push(this.root)
          while (queue.length > 0) {
            let node = queue.shift()
            result.push(node.data)
            if (node.left !== null) {
              queue.push(node.left)
            }
            if (node.right !== null) {
              queue.push(node.right)
            }
          }
          return result
        }
      }
    }
    
    const bst = new BST()
    

    相关文章

      网友评论

          本文标题:二叉树

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