zoukankan      html  css  js  c++  java
  • 二叉树的基本概念

    一、树的基本概念:树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。

      (1)每个元素称为结点(node);

      (2)有一个特定的结点被称为根结点或树根(root);

      (3)相关术语:

          结点的度:一个结点含有的子树的个数

          叶子结点或终端结点:度为0的结点

         节点的层数: 树根到节点的路径长度是该节点的层数,节点都有层数,根所在的层为0

         树的高度或深度:树的高度或深度是树中节点的最大层数(最长路径的长度)加1 ,空树高度为0,只有根节点的树高度为1

        

    二、二叉树 :每个节点最多含有两个子树的树称为二叉树;

      1、普通二叉树的特点:

        (1)结点的度:一个结点含有的子树的个数(0,1,2);

        (2)在非空二叉树中,第i层的结点总数不超过 ,  i>=1;

        (3)深度为h的二叉树最多有  个结点(h>=1),最少有h个结点;

        (4)对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;

      2、二叉树的分类

        (1)完全二叉树(Complete Binary Tree) :若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

          性质:有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:

             若I为结点编号则 如果I>1,则其父结点的编号为I/2;
             左孩子编号为:当前父结点编号的两倍 + 1
             右孩子编号为:当前父结点编号的两倍 + 2
             

                         

        (2)完美/满二叉树(Perfect Binary Tree):除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。性质:深度为h的二叉树有  个结点(h>=1)

                                                                    

       (3)二叉查找树:指一棵空树或者具有下列性质的二叉树    

          1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

          2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

          3. 任意节点的左、右子树也分别为二叉查找树。

          4. 没有键值相等的节点。

          性质:主要用于查找,但查找的效率与树的深度有关,一般时间复杂度为O(nlogn),

             是对二分查找算法的改善;二叉排序树上的查找与二分查找相差不大,且二叉排序树上的插入和删除结点十分方便,但当树为单只树时,查找效率退化O(n)

                  

        

        (4)平衡二叉搜索树:为了解决二叉查找树高度问题,在二叉查找树的基础上,增加了平衡因子。

            性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

            平衡二叉树的常用实现方法有红黑树、AVL等。 

           a、AVL:AVL是最先发明的自平衡二叉查找树算法。在AVL中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树, n个结点的AVL树最大深度约1.44log2n。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

          b、红黑树:红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组,他称之为"对称二叉B树",它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。

           此外,还有平衡多叉查找树(B/B-树),B+树(B树的优化版)

  • 相关阅读:
    linux系统日志及其rsyslog服务
    C++
    程序员之---C语言细节18(一些奇怪表达式)
    Spring MVC的简单使用方法
    Android系统开发(4)——Autotools
    大话设计模式C++版——代理模式
    JS获取地址栏并拼接參数
    二叉树的应用(1)--二叉树排序树基本操作
    【LeetCode-面试算法经典-Java实现】【067-Add Binary(二进制加法)】
    Android 实现形态各异的双向側滑菜单 自己定义控件来袭
  • 原文地址:https://www.cnblogs.com/dongtian-blogs/p/10768194.html
Copyright © 2011-2022 走看看