树
二叉树
使用Java实现二叉树:
public class BinaryTree {
public static class Node {
public Node(int val) {
this.val = val;
}
public int val;
public Node left;
public Node right;
}
public static void main(String[] args) {
Node head = new Node(1);
head.left = new Node(2);
head.right = new Node(3);
head.left.left = new Node(4);
head.left.right = new Node(5);
head.right.left = new Node(6);
head.right.right = new Node(7);
}
}上述的代码转换为二叉树图形如下:

前序遍历、中序遍历、后序遍历
二叉树的遍历分为三种:
前序遍历:头、左、右, 1、2、4、5、3、6、7
中序遍历:左、头、右, 4、2、5、1、6、3、7
后续遍历:左、右、头, 4、5、2、6、7、3、1
这里的前序、后序、中序,针对的目标是头节点,头节点在最前面,就是前序。
使用Java代码实现三种遍历方式:
递归序遍历
前序遍历、中序遍历、后序遍历都是对递归序的改造;使用递归序遍历二叉树,每个节点都会被遍历三次,在前中后三个位置每次都打印即是递归序:
结果为 1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 7 3 1 ,如果只保留每个数字第一次出现的情况,那么就是前序遍历:1 2 4 3 6 7;同理,如果保留第二次出现的情况就是中序遍历;保留最后一次出现的情况,那么就是后序遍历。
比较两颗二叉树结构是否完全相同
对应试题:https://leetcode-cn.com/problems/same-tree/
可以使用递归序遍历比较每个节点:
判断一颗树是否是镜面树
对应试题:
左右对称的树称为镜面树:

头节点不可能破坏镜面关系
头节点下可以分为左右两个子树,他们相同的一层之间的左子树与对方的右子树相同
Java实现如下:
返回一棵树的最大深度
对应试题:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
从前序与中序遍历序列构造二叉树
对应试题:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
二叉树按层遍历并收集节点
对应试题:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
解题思路:
从树的头开始遍历,将头加入到目标队列中
遍历队列中的所有元素,将其弹出
将弹出的所有元素的子结点放入到队列中,跳转2步骤
当树的每一层都遍历过了,遍历循环结束
判断树是否是平衡二叉树
对应leetcode:https://leetcode-cn.com/problems/balanced-binary-tree/
平衡二叉树:在一个二叉树中,每一颗子树的左子树的深度与右子树的深度 <= 1,并且左数是一个平衡二叉树、右树也是一个平衡二叉树。
判断树是否是搜索二叉树
在一个树中,每一颗子树的左树的值都比当前值小,右树的值都比当前值大。
判断一个二叉树是否是搜索二叉树:
采用中序遍历,如果是搜索二叉树,中序遍历的结果是递增的
采用递归(左树是搜索二叉树、右树是搜索二叉树,且左树的根节点小于当前值,右树的根节点大于当前值)
对应leetcode:https://leetcode.cn/problems/validate-binary-search-tree/
采用递归:
二叉树路径总和
对应Leetcode:https://leetcode.cn/problems/path-sum/
解法:
二叉树收集达标路径总和
Leetcode: https://leetcode.cn/problems/path-sum-ii/
解法(自己独立写的性能很差):
堆
优先级队列
定义:优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。
优先级队列的逻辑存储结构并不是队列,他是一种具有FIFO特征的堆结构(也就是树形结构)。每次从优先级队列中取出的是具有最高优先权的元素,内部按照优先权堆数据元素排序。
比如在Java中的PriorityQueue类,就是优先级队列的实现,默认是一个小根堆(先弹出最小的元素):
最后更新于
这有帮助吗?