树🌲
参考资料
文章中大部分图片出自此处,多为以下文章的概括整理!
Wiki:维基百科:树_数据结构
CSDN:
youtube:Lin Clark - A Cartoon Intro to Fiber - React Conf 2017
百度百科:二叉搜索树
Chrome V8 源码:https://cs.chromium.org/chromium/src/v8/src/
大纲
-
树
-
二叉树
- 完全二叉树
- 满二叉树
- 线索二叉树
-
二叉搜索树
-
平衡二叉搜索树(AVL树)
-
红黑树
-
B 树
-
B+树
-
扩展:react 中的 WIP 树
-
其他的树🌲🌲🌲
树
抽象数据结构
它是由n(n>0)个有限节点组成一个具有层次关系的集合
术语
- 节点的度:一个节点含有的子树的个数称为该节点的度;
- 树的度:一棵树中,最大的节点度称为树的度;
- 叶节点或终端节点:度为零的节点;
- 非终端节点或分支节点:度不为零的节点;
- 父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
- 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
- 兄弟节点:具有相同父节点的节点互称为兄弟节点;
- 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
- 深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0;
- 高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;
- 堂兄弟节点:父节点在同一层的节点互为堂兄弟;
- 节点的祖先:从根到该节点所经分支上的所有节点;
- 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
- 森林:由m(m>=0)棵互不相交的树的集合称为森林;
图表示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z97CHIOZ-1574081118502)(/Users/huangzijian/Library/Application Support/typora-user-images/pastedGraphic.png)]
二叉树
每个节点最多两个子节点的 树。
由此引申出来的术语:
- 左子树
- 右子树
遍历方式
// treeNode
class Node {
Node left,
Node right,
string val,
};
根据上述数据结构,引申出来的遍历方式:
关于二叉树的遍历方式等算法,可以参考:leetCode
深度遍历
对于这样的一棵二叉树:
前序遍历
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function (root) {
const nums = [];
if (!root) {
return nums;
}
const stack = [];
let node = root;
stack.push(node);
while (stack.length) {
node = stack.pop();
// ***
nums.push(node.val); // visit
// ***
if (node.right) {
stack.push(node.right);
}
if (node.left) {
stack.push(node.left);
}
}
return nums;
};
遍历结果: 1,2,4,8,9,5,10,11,3,6,12,13,7,14,15
中序遍历
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @ret