javascript数据结构 -- 树(二)

160 阅读2分钟

树(Tree)

本文作为树数据结构的第二篇,介绍大名鼎鼎的二叉搜索树BST, 正是由于二叉搜索树的一些规定约束,才使得树结构在搜索和排序相对其它数据结构获得优势。

1. BST是什么

首先每一个节点都被赋予一个key值,然后根据key的值形成树,规则如下:

  • 右子节点的key的值必须大于根节点的key值
  • 左子节点的key的值必须小于根节点的key值
  • 子树也必须是另一个BST
    BST保证了,较小的值总是在左侧,而较大的值总是在右侧;而这个规则则是可以看成是借鉴了有序数组的二分查找方法的思想

2. 二分查找

二分查找是有序数据结构查找的利器,而不仅仅是有序数组进行查找的利器。

3. BST的节点属性

  • key属性:表示节点的权重
  • left属性:保持对左子节点的引用
  • right属性:保持对右子节点的引用
class _Node {  
    left = null;  
    right = null;  
    constructor (public key: number ) {}  
}  

4. BST属性

  • root属性:保持对根节点的引用;BST本身只需要保持对root的引用就可以了,其他节点都可以通过root查找到;
class _BST_ {  
    root = null;  
}  

5. BST方法

    1. insert(key): 向树中添加一个新的节点;
    1. search(key): 根据key查找树中的节点,如果找到了返回此节点,如果没有找到返回null;
    1. inOrderTracerse(): 中序遍历树中的所有节点;
    1. preOrderTracerse(): 先序遍历树中的所有节点;
    1. postOrderTracerse(): 后序遍历树中的所有节点;
    1. min(): 返回树中key最小的节点;
    1. max(): 返回树中key最大的节点;
    1. remove(key): 删除树中对应key的节点;

6. BST结构

由于BST确实比较复杂,故这篇文章不会针对每一个方法逐个实现,而是先将其整体结构写出来,然后再逐个实现:

class _Node {  
    left = null;  
    right = null;  
    constructor (public key: number) {}  
}  
  
class _BST {  
    root: _Node | null = null;  
    insert(key: number): void{}  
  
    insertNode(node: _Node, newNode: _Node): void {}  
  
    preOrderTraverse(handler: Function): void {}  
  
    preOrderTraverseNode(node: _Node, handler: Function): void {}  
  
    midOrderTraverse(handler: Function): void {}  
  
    midOrderTraverseNode(node: _Node, handler: Function): void {}  
  
    postOrderTraverse(handler: Function): void {}  
  
    postOrderTraverseNode(node: _Node, handler: Function): void {}  
  
    min(): number {return -1;}  
  
    max(): number {return -1;}  
  
    search(key: number): null | _Node {return null;}  
  
    searchNode(node: _Node, key: number): null | _Node {return null;}  
  
    // 非常难搞  
    remove(key: number): boolean {return false;}  
}