二叉树简析

209 阅读2分钟

树介绍

根节点在哪里就是什么序遍历

  • 先序遍历:根、左子树、右子树(特点:第一个元素为根)

  • 中序遍历:左子树、根、右子树(特点:根的两边分别为左子树和右子树)

  • 后序遍历:左子树、右子树、根(特点:最后一个元素为根)

示例题目

分别按照二叉树先序,中序和后序打印所有的节点。

class Solution:
    def threeOrders(self , root ):
        # write code here
        pre, mid, after = [], [], []
        def dfs(proot):
            if root is None:
                return None
            pre.append(root.val)
            # 遍历左树
            dfs(root.left)
            mid.append(proot.val)
            # 遍历右树
            dfs(root.right)
            after.append(root.val)
        dfs(root)
        return [pre, mid, after]

几种特殊的二叉树

满二叉树

所有叶结点同处于最底层(非底层结点均是内部结点),一个深度为k且有2^(k+1) - 1个结点(第一层算是从0开始)

完全二叉树

叶结点只能出现在最底层的两层,且最底层叶结点均处于次底层叶结点的左侧。规模为n的完全二叉树,高度为

平衡二叉树

平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。

对于平衡二叉树要特别注意的是,不要求非叶节点都有两个子结点,仅要求两个子树的高度差的绝对值不超过1,或者为空树。

二叉搜索树

搜索二叉树为了搜索而设计,要求也是将无序存储变成有序。即每个节点的值要比左子树的值大,比右子树的值小

二叉树缺点

二叉树的四大缺点:

  • 每个非叶子节点至多两个子树,每个节点存储一个关键字。

  • 树的搜索深度不一致,搜索稳定性不好,查询效率不稳定。

  • 同样的关键字集合,根节点的关键字选择不好,树的深度结构差异很大。

  • 为了让二叉树尽量保持平衡,延伸出“平衡叉树”,即B树。

二叉树的存储方式

存储的方式和图一样,有链表和数组两种,用数组存访问速度快,但插入、删除节点操作就比较费时了。实际中更多的是用链来表示二叉树的。