美文网首页
JavaScript实现二叉树

JavaScript实现二叉树

作者: 没头脑很不高兴 | 来源:发表于2019-03-16 18:38 被阅读0次

定义: 二叉树是每个结点最多有两个子树的树结构

如图, 这表示一个二叉树的一部分, 每个二叉树有一个起点(根节点), 这个节点除了记录它本身的数据外, 还记录它的2个子节点是谁, 它左边的子节点上的数据会比它自身的数据小, 右边的会比它自身的数据大(或等于)

image.png

我们用下面的这个类来表示二叉树的组成部分(节点)


class Node {
  constructor(data, left, right) {
    this.data = data
    this.left = left
    this.right = right
  }
  show() {
    return this.data
  }
}

在实例化的时候, 它会记录本身的数据, 以及左/右子节点的引用值, 左右节点也是一个 Node 的实例, 同时, 它还有一个 show 方法, 用于展示自己的数据

那么, 如果生成一个二叉树呢?
分成以下几步

  1. 在初始化时, 可以先假定一个 null 作为它的根节点
  2. 如果有一个数据需要放进这个二叉树, 那么先将这个数据实例成 Node 类型的节点, 为了方便后面的描述, 我们把这个节点命名为 n, 然后判断这个二叉树的根节点是否为 nul:
    • 如果为null, 就将根节点的值设置为这个数据;
    • 如果不为null, 就开始一个循环, 首先是根节点:
      • 如果这个数据比根节点小, 那么看一下 左节点是否为 null, 如果是null, 则就地赋值为 n, 并停止循环
      • 反之, 看一下 右节点是否为 null, 如果是null, 则就地赋值为 n, 并停止循环
        • 如果在上面 2 条执行过程中, 左节点或者右节点不为 null, 则把 该节点当成 之前的根节点, 继续这一过程

上面的循环就是一个迭代的过程, 理清思路之后, 代码就可以写出来了

class BST {
  constructor() {
    this.root = null 
  }
  insert(data) {
    const n = new Node(data, null, null)
    if (this.root === null) {
      this.root = n
    } else {
      let current = this.root
      while (1) {
        if (data < current.data) {
          if (current.left === null) {
            current.left = n
            break 
          }
          current = current.left
        } else {
          if (current.right === null) {
            current.right = n 
            break
          }
          current = current.right
        }
      }
    }
  }
}

未完待续

inOrder(node) { 
  if (node !== null) {
    this.inOrder(node.left)
    console.log('inOrder', node.show())
    this.inOrder(node.right)
  }
}
preOrder(node) {
  if (node !== null) {
    console.log('preOrder', node.show())
    this.preOrder(node.left)
    this.preOrder(node.right)
  }
}
postOrder(node) {
  if (node !== null) {
    this.postOrder(node.left)
    this.postOrder(node.right)
    console.log('postOrder', node.show())
  }
}
getMin() {
  let current = this.root 
  while (current.left !== null) {
    current = current.left 
  }
  return current.data 
}
getMax() {
  let current = this.root 
  while (current.right !== null) {
    current = current.right
  }
  return current.data 
}
getSmallest(node) {
  let current = node 
  while (current.right !== null) {
    current = current.right
  }
  return current.data 
}
find(data) {
  let current = this.root 
  while (current !== null) {
    if (current.data === data) {
      return current 
    } else if (data < current.data) {
      current = current.left 
    } else {
      current = current.right 
    }
  }
  return null 
}
remove(data) { 
  return this.removeNode(this.root, data)
}
removeNode(node, data) {
  if (node === null) {
    return null
  }
  if (data === node.data) {
    if (node.left === null && node.right === null) {
      return null 
    }
    if (node.left === null) {
      return node.right 
    }
    if (node.right === null) {
      return node.left
    }
    const tempNode = this.getSmallest(node.right)
    node.data = tempNode.data
    node.right = this.removeNode(node.right, data)
    return node
  } else if (data < node.data) {
    node.left = this.removeNode(node.left, data)
    return node
  } else {
    node.right = this.removeNode(node.right, data)
    return node
  }
}

相关文章

  • 二叉树查找与节点删除的javascript实现

    前言 紧接前面说过的 二叉树的实现 和 二叉树的遍历,今天来说一下用javascript实现二叉树的查找和节点删除...

  • 关于函数递归和迭代的转化, 及尾递归相关知识的接触和思考

    javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作 js 二叉树 【数据结构与算法】深入浅出递...

  • 二叉树

    本文内容学习自JavaScript实现二叉树 二叉树 二叉树是每个节点最多有两个子树的树结构。通常子树被称左子树和...

  • Javascript实现二叉树算法

    最近正在看慕课网的《Javascript实现二叉树算法》课程,现把看到的东西记录下来。什么是二叉树?简单来说,二叉...

  • 二叉树遍历的javascript实现

    前言:紧接着上篇 二叉树的javascript实现 ,来说一下二叉树的遍历。本次一本正经的胡说八道,以以下这个二...

  • 前端常见数据结构小结

    常见数据结构的 JavaScript 实现 栈 队列 链表 集合 字典 哈希表 二叉树 图 前端与数据结构 数据结...

  • python实现二叉树

    递归实现二叉树 堆实现二叉树前序遍历

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • JavaScript实现二叉树

    定义: 二叉树是每个结点最多有两个子树的树结构 如图, 这表示一个二叉树的一部分, 每个二叉树有一个起点(根节点)...

  • JavaScript 二叉树

    一个基本的基于 JavaScript 的二叉树

网友评论

      本文标题:JavaScript实现二叉树

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