zoukankan      html  css  js  c++  java
  • 树,二叉树,二叉搜索树

    树:

      树有很多节点,用以存储元素。某些节点之间存在一定的关系,用连线表示,连线称为。边的上端节点称为父节点,下端称为子节点。树像一个不断分叉的树根。  每个节点可以有多个子节点,而该节点是相应子节点的父节点。树有一个没有父节点的节点,称为跟节点。没有子节点的节点称为叶节点。树中节点的最大层次被称为深度

    下面给出一个定义树的方法:

      1.树是元素的集合。

      2.该集合可以为空。这时树中没有元素,我们称树为空树(empty tree)。

      3.如果该集合不为空,那么该集合有一个根节点,以及0个或者多个子树。跟节点与它的子树的节点用一个边(edge)相连。

      上面的第三点是以递归的方式来定义树,也就是在定义树的过程中使用了树自身(子树)。由于树的递归特征,许多树相关的操作也可以方便的使用递归实现。

    树的实现:

      树的示意图已经给出了树的一种内存实现方式:每个节点存储元素和多个指向子节点的指针。然而,子节点数目是不确定的。一个父节点可能有大量的子节点。而另一个父节点可能只有一个子节点,而树的增删节点操作会让子节点的数目发生进一步的变化。这种不确定性就可能带来大量的内存操作。并且容易造成内存的浪费。

      一个经典的实现方式:拥有同一父节点的两个节点互为兄弟节点(sibling).每个节点包含有一个指针指向第一个子节点,并有另一个指针指向它的下一个兄弟节点。这样,就可以用统一的、确定的结构来表示每个节点。

    二叉树和二叉搜索树:

      二叉树是一种特殊的树。二叉树的每个节点最多只能有2个子节点。

      

      由于二叉树的子节点数目确定,所以可以直接采用上图方式在内存中实现。每个节点有一个左子节点(left children)右子节点(right children)。左子节点是左子树的根节点,右子节点是右子树的根节点。

      如果我们给二叉树加一个额外的条件,就可以得到一种被称为二叉搜索树(binary search tree)的特殊二叉树。二叉搜索树要求:每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大(如果我们假设树中没有重复的元素,那么上述要求可以写成:每个节点比它左子树的任意节点大,而且比它右子树的任意节点小)。

      二叉搜索树可以方便的实现搜索算法。在搜索元素x的时候,我们可以将x和根节点比较:

      1.如果x等于根节点,那么找到x,停止搜索(终止条件);

      2.如果x小于根节点,那么搜索左子树;

      3.如果x大于根节点,那么搜索右子树。

      二叉搜索树所需要进行的操作次数最多与树的深度相等。n个节点的二叉搜索树的深度最多为n,最少位log(n).

      删除节点相对比较复杂。删除节点后,有时需要进行一定的调整,以恢复二叉搜索树的性质(每个节点都不比它左子树的任意节点小,而且不比它的右子树的任意节点大)。

      *叶节点可以直接删除。

      *删除非叶节点时,比如下图中的节点8,我们可以删除左子数中最大的元素(或者右子树中最大的元素),用删除的节点来补充元素8产生的空缺。但该元素可能也不是叶节点,所以它产生的空缺需要其他元素补充……直到最后删除一个叶节点。上述过程可以递归实现。

      

      

  • 相关阅读:
    Python 数据类型
    Python 基础
    多表联查和子查询
    python基础中数据类型
    小说体验报告--微信输入法语音转文字--atm转账--签到礼盒的设计点
    PC端和移动端 微信加入群聊--游戏签到 --模拟打车的测试用例设计点
    jmeter连接mysql数据库时报无法创建PoolableConnectionFactory(拒绝用户的root@localhost访问(使用密码:YES))
    jmeter 软件测试
    postman的使用
    Fiddler抓取 模拟机HTTPS包
  • 原文地址:https://www.cnblogs.com/QoQian/p/4751079.html
Copyright © 2011-2022 走看看