树(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方法
-
- insert(key): 向树中添加一个新的节点;
-
- search(key): 根据key查找树中的节点,如果找到了返回此节点,如果没有找到返回null;
-
- inOrderTracerse(): 中序遍历树中的所有节点;
-
- preOrderTracerse(): 先序遍历树中的所有节点;
-
- postOrderTracerse(): 后序遍历树中的所有节点;
-
- min(): 返回树中key最小的节点;
-
- max(): 返回树中key最大的节点;
-
- 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;}
}