二叉树

使用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);
    }
}

上述的代码转换为二叉树图形如下:

image-20220407140438757

前序遍历、中序遍历、后序遍历

二叉树的遍历分为三种:

  1. 前序遍历:头、左、右, 1、2、4、5、3、6、7

  2. 中序遍历:左、头、右, 4、2、5、1、6、3、7

  3. 后续遍历:左、右、头, 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/

可以使用递归序遍历比较每个节点:

判断一颗树是否是镜面树

对应试题:

左右对称的树称为镜面树:

image-20220407153824069
  1. 头节点不可能破坏镜面关系

  2. 头节点下可以分为左右两个子树,他们相同的一层之间的左子树与对方的右子树相同

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/

解题思路:

  1. 从树的头开始遍历,将头加入到目标队列中

  2. 遍历队列中的所有元素,将其弹出

  3. 将弹出的所有元素的子结点放入到队列中,跳转2步骤

  4. 当树的每一层都遍历过了,遍历循环结束

判断树是否是平衡二叉树

对应leetcode:https://leetcode-cn.com/problems/balanced-binary-tree/

平衡二叉树:在一个二叉树中,每一颗子树的左子树的深度与右子树的深度 <= 1,并且左数是一个平衡二叉树、右树也是一个平衡二叉树。

判断树是否是搜索二叉树

在一个树中,每一颗子树的左树的值都比当前值小,右树的值都比当前值大。

判断一个二叉树是否是搜索二叉树:

  1. 采用中序遍历,如果是搜索二叉树,中序遍历的结果是递增的

  2. 采用递归(左树是搜索二叉树、右树是搜索二叉树,且左树的根节点小于当前值,右树的根节点大于当前值)

对应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类,就是优先级队列的实现,默认是一个小根堆(先弹出最小的元素):

最后更新于

这有帮助吗?