树是数据结构中常见的一种结构,由于其特殊的结构给我们提供了对数级别的访问速度,同时也是与递归概念结合最紧密的数据结构,树的子树还是树。本文整理了常见的树、常用算法和应用,对一些深入和底层的原理没有进行过多的研究,整个相对比较粗浅,旨在对常见的树结构有大致的了解。
常用到提到的树结构有:二叉查找树,平衡二叉树,红黑树,B树,B+树,字典树。
一、二叉树
二叉树是树家族中最常见也是最基本的一种结构。
1. 定义
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。
简单来说就是每个结点最多有两个子树的树结构。
2. 完全二叉树
只有最先面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的二叉树(向左补满)
3.满二叉数
除了叶子结点每个结点都有左右子叶且叶结点都处在最底层的二叉树。
4.算法
二叉树的算法主要包括遍历和创建两个。
(1)遍历
二叉树的遍历分为三种遍历方式:
- 前序遍历:先访问根结点,再左子树,再右子树
- 中序遍历:先访问左子树, 再根结点,再右子树
- 后续遍历:先访问左子树, 再右子树,再根结点
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
// 前序遍历
public void preOrder (TreeNode node) {
if (node == null) {
System.out.println("null");
return;
}
System.out.println(node.val);
preOrder(node.left);
preOrder(node.right);
}
// 中序遍历
public void inOrder (TreeNode node) {
if (node == null) {
System.out.println("null");
return;
}
inOrder(node.left);
System.out.println(node.val);
inOrder(node.right);
}
// 后序遍历
public void postOrder (TreeNode node) {
if (node == null) {
System.out.println("null");
return;
}
inOrder(node.left);
inOrder(node.right);
System.out.println(node.val);
}
(2)还原二叉树
二叉树可以通过[前序]+[中序] 或 [后序]+[中序]两种方式还原。
一下图为例