树 Tree 二叉树,平衡二叉树(红黑树), B树,B+树

1, 树,平时最常用的树就是二叉树(其实也有多叉树),二叉树可以用链表和数组来存储。

2,二叉树,最多只有两个子节点,满二叉树是指叶子节点都在最底层,其余所有节点都有左右2个子节点,他是一种特殊的完全二叉树。

3. 完全二叉树,是指叶子节点都在最底2层,最后一层叶子节点靠左边排列,并且除了最后一层,其他节点个数都达到最大。

4. 某棵二叉树是一棵完全二叉树,那用数组存储是最节省内存的一种方式。只会浪费一个下标未0的存储位置。

5. 二叉树的遍历,有前序、中序和后续,实际上他们是一个递归过程,遍历的时间复杂度为O(n)

二叉查找树,Binary Search Tree, BST

又叫二叉搜索树,是为了实现快速查找而生的,定义是在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值,中序遍历出来就是一个升序集合。插入、删除、查找操作时间复杂度才是 O(logn)

它与散列表比较来看,散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩容、缩容等。平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。

红黑树

是一种平衡二叉查找树,红黑树的插入、删除、查找各种操作性能都比较稳定,不会退化。

红黑树特点

根节点是黑色的;

每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;

任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;

每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;

B

B+ 只存索引,比如数据库的Index,非聚集索引,不确定的m叉平衡搜索树,索引存在硬盘里,减少IO操作,查询效率更高,单插入、删除时候需要维护。

B树和B-树,其实是同一个东东,他不仅存索引,还存对应的数据,它们其实是B+树的低配版本。

堆,又名优先级队列

堆是一个特殊的完全二叉树

堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值

所以有大顶堆,小顶堆,存储top k大的数,中位数问题,以及衍生的99%接口访问时间等问题

还有堆排序,先构建一个堆,比如小顶堆,然后在依次拿出堆顶元素放到数组的对应位置,就是一个升序结果的数组。

Leetcode原题

a. 翻转二叉树

 https://leetcode-cn.com/problems/invert-binary-tree/ 递归

b. 二叉数最大深度

 https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/ 递归和BFS

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            int leftHeight = maxDepth(root.left);
            int rightHeight = maxDepth(root.right);
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
}
class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        int ans = 0;
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size > 0) {
                TreeNode node = queue.poll();
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
                size--;
            }
            ans++;
        }
        return ans;
    }
}

c. 验证是否是一棵有效的二叉查找数

 https://leetcode-cn.com/problems/validate-binary-search-tree/

d. 二叉树路径总和

   https://leetcode-cn.com/problems/path-sum/

 

posted @ 2020-08-22 15:56  lswtianliang  阅读(307)  评论(0编辑  收藏  举报