二叉树
满二叉树
- 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
完全二叉树
- 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。
- 优先级队列其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系。(大顶堆,小顶堆)
堆
- 如果有一个关键码的集合k={k0,k1,k2,……kn-1},把所有的元素按照完全二叉树的顺序存储方式存储在一个一维数组中。如果满足:ki<=k2i+1且ki<=k2i+2; i=0,1,2……则称之为小堆;如果满足:ki>=k2i+1,ki>=k2i+2; i=0,1,2……则称之为大堆;将根节点最大的根叫做最大堆根或大根堆,将根节点最小的堆叫做最小堆或小根堆。
小根堆中,所有父节点的值小于等于子节点的值
大根堆中,所有父节点的值大于等于子节点的值
二叉搜索树
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树
平衡二叉搜索树
- 左右子树的高度差不小于1的二叉搜索树
- 平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
二叉树的存储方式
- 链式存储
- 线性存储
二叉树的遍历方式
-
深度优先遍历(递归/迭代)
-
前序遍历(根->左->右)
class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode() {} public TreeNode(int val) { this.val = val; } } class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); preorder(root, res); return res; } public void preorder(TreeNode node, List<Integer> list) { if (node == null) { return; } list.add(node.val); preorder(node.left, list); preorder(node.right, list); } }
-
中序遍历(左->根->右)
class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); inorder(root, list); return list; } public void inorder(TreeNode node, List<Integer> list) { if (node == null) return; inorder(node.left, list); list.add(node.val); inorder(node.right, list); } }
- 后序遍历(左->右->根)
class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); postorder(root, res); return res; } public void postorder(TreeNode node, List<Integer> list) { if (node == null) return; postorder(node.left, list); postorder(node.right, list); list.add(node.val); } }
-
-
广度优先遍历(迭代)
- 层序遍历
二叉树的定义
class Node {
int val;
Node left;
Node right;
public Node() {}
public Node(int val) {
this.val = val;
}
}
Node root = new Node(1);
Node node1 = new Node(2);
Node node2 = new Node(3);
root.left = node1;
root.right = node2;