概述
树是有多个指向下一个节点指针的链表,且这种指向是单向的,且每个节点最多只能有一个上级节点(在树中称为父节点),如果有多个上级节点,便是图。
树的实现
leetcode中默认树节点的实现为
function TreeNode(val, left, right) {
this.val = (val===undefined ? 0 : val)
this.left = (left===undefined ? null : left)
this.right = (right===undefined ? null : right)
}
最常用的树是二叉树,即每个节点保存一个值,并有两个指针指向下一个节点(父节点指向子节点),极端情况下,如果每个父节点只存在一个子节点便是单向链表。
没有子节点的节点被称为叶子节点,两个指针指向null。
树是比链表更典型的递归数据结构。
树的分类
二叉树
树的任意节点最多有两个子节点
二叉树又分为
- 满二叉树 除叶子节点外的其他节点都有两个子节点
- 完全二叉树 除了最后一层外其他节点构成满二叉树,且最后一层节点左对齐,满二叉树是一种特殊的完全二叉树
- 二叉搜索树(Binary Search Tree)如果子节点存在,任何节点的值大于左子节点的值,小于右子节点的值。
- 二叉平衡搜索树(AVL)是一个二叉搜索树,而且所有节点左右子树高度差不超过1
- 红黑树 和AVL类似,但是平衡要求没那么严格
字典树
trie,又称为前缀树,用于存储和检索字符串,实现细节可参考实现 Trie (前缀树)。
相关题型
树相关的很大一部分和搜索相关,树的搜索和图的搜索有很多相同的知识点,因此会等图结束单独解释。
由于二叉树的递归结构,大部分题可以用递归实现,比如