数据结构之树(二叉树和二叉搜索树)

766 阅读2分钟

这是我参与更文挑战的第25天,活动详情查看:更文挑战

什么是二叉树

二叉树:是每个结点最多有两个子树的树结构。一个是左侧子节点,一个是右侧子节点。

二叉搜索树(BST)是二叉树的一种,但是它只允许你在左侧节点存储(比父节点)小的值,在右侧节点存储(比父节点)大(或者等于)的值

二叉搜索树示意图.png

我们先从二叉搜索树开始学习:

二叉搜索树和链表一样,通过指针来表示节点之间的关系(术语称之为边)。而我们知道在双向链表中,每个节点包含两个指针,一个指向后一个节点,一个指向前一个节点。而树也是这样的,一个指向左侧子节点,一个指向右侧子节点。我们在树结构中将节点称为键,键是树相关的术语中对节点的称呼。

实现二叉树需要的方法

  • insert(key): 向树中插入一个新的键。
  • search(key): 在树中查找一个键,如果节点存在返回true,如果不存在则返回false。
  • inOrderTraverse: 通过中序遍历方式遍历所有节点。
  • preOrderTraverse: 通过先序遍历方式遍历所有节点。
  • postOrderTraverse: 通过后序遍历方式遍历所有节点。
  • min: 返回树中最小的值/键。
  • max: 返回树中最大的值/键。
  • remove(key): 从树中移除某个键。

实现二叉树

首先创建 BinarySearchTree 类。

function BinarySearchTree () {
    // 初始化根节点为null
    let root = null
    // 声明节点Node类,用于创建多个独立的节点
    let Node = function (key) {
        this.key = key
        this.left = null
        this.right = null
    }
    // 下面是methods
    this.insert = function (key) {
        // 首先根据传入的键生成节点node
        let newNode = new Node(key)
        // 插入之前判断当前树中是否有根节点
        if (!root) {
            root = node
        } else {
            // 根节点存在则判断插入逻辑,需要辅助函数 insertNode
            insertNode(root, newNode)
        }
    }
    // 插入逻辑实际上就是判断要插入的子节点和父节点之间的大小,从而决定是该放在左边还是右边
    let insertNode = functicon (node, newNode) {
        // 左侧节点只能存放比父节点小的值
        if(newNode.key < node.key) {
            // 当前节点的左侧节点为空则可以插入,否则递归调用 insertNode
            !node.left ? node.left = newNode : insertNode(node.left, newNode)
        } else {
            // 当前节点的右侧节点只能存放大于等于父节点的值
            !node.right ? node.right = newNode : insertNode(node.right, newNode)
        }
    }
}

未完待续。。。