二叉树的理论基础
二叉树的种类
-
满二叉树:一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
深度为k,有2^k-1个节点 -
完全二叉树:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h -1 个节点。
-
二叉搜索树:二叉搜索树是一个有序数,有数值。
1 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3 它的左、右子树也分别为二叉排序树
-
平衡二叉搜索树(Adelson-Velsky and Landis: AVL):它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_map底层实现是哈希表。
二叉树的存储方式
- 链式存储:指针
- 顺序存储:数组
二叉树的遍历方式
- 深度优先遍历
前序遍历(中左右)
中序遍历(左中右)
后序遍历(左右中)
- 广度优先遍历
层次遍历(迭代法)
二叉树的定义
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}