二叉搜索树

96 阅读1分钟

1、特点:

(1)、每个节点都有两个子节点 (2)、左侧节点小于右侧节点

2、实现

(1)实现插入函数

  <!DOCTYPE html>
  <html lang="en">

  <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
  </head>
  <body>

  </body>
  </html>
  <script>

      function Tree() {
          function Node(value) {
              this.value = value
              this.left = null
              this.right = null
          }
          var root = null
          function traverse(node, callback) {
              if (node == null) return false
              traverse(node.left, callback)
              traverse(node.right, callback)
              callback(node.value)
          }
          //遍历节点
          this.traverse = function (callback) {
              traverse(root, callback)
          }
          function insertNode(node, newNode) {
              if (newNode.value > node.value) {
                  if (node.right === null) {
                      node.right = newNode
                  } else {
                      insertNode(node.right, newNode)
                  }
              } else if (newNode.value < node.value) {
                  if (node.left === null) {
                      node.left = newNode
                  } else {
                      insertNode(node.left, newNode)
                  }
              }
          }
          //插入节点
          this.insert = function (value) {
              var newNode = new Node(value)
              if (root === null) {
                  root = newNode
              } else {
                  insertNode(root, newNode)
              }
          }
          //获取根节点
          this.getRoot = function () {
              return root
          }
          function min(node) {
              if (node == null) return null
              while (node && node.left) {
                  node = node.left
              }
              return node.value
          }
          //获取节点最小值
          this.min = function () {
              return min(root)
          }

          function max(node) {
              if (node == null) return null
              while (node && node.right) {
                  node = node.right
              }
              return node.value
          }
          //获取节点最大值
          this.max = function () {
              return max(root)
          }
          function removeNode(node, value) {
              if (node === null) return null
              if (value > node.value) {
                  node.right = removeNode(node.right, value)
              } else if (value < node.value) {
                  node.left = removeNode(node.left, value)
              } else {
                  //执行删除过程
                  if (node.left === null && node.right === null) {
                      node = null
                      return node
                  }
                  //只有一个子节点的条件
                  if (node.left === null && node.right) {
                      node = null
                      return node.right
                  } else if (node.right === null && node.left) {
                      node = null
                      return node.left
                  }
              }
          }
          //删除节点
          this.remove = function (value) {
              root = removeNode(root, value)
          }
      }

      var t = new Tree

      t.insert(8)
      t.insert(2)
      t.insert(9)
      t.insert(3)
      console.log(t.getRoot())

      t.traverse(function (value) {
          console.log(value)
      })
      console.log(t.min())
      console.log(t.max())
  </script>