建站模板工程造价,辽宁建设工程信息网联合体怎么报名,latex wordpress,网络销售适合什么人做1.二叉树种类
1.1 满二叉树
满二叉树#xff1a;如果一棵二叉树只有度为 0 0 0 的结点和度为 2 2 2 的结点#xff0c;并且度为0的结点在同一层上#xff0c;则这棵二叉树为满二叉树。
如图所示#xff1a;
这棵二叉树为满二叉树#xff0c;也可以说深度为 k k k如果一棵二叉树只有度为 0 0 0 的结点和度为 2 2 2 的结点并且度为0的结点在同一层上则这棵二叉树为满二叉树。
如图所示
这棵二叉树为满二叉树也可以说深度为 k k k有 2 k − 1 2^k-1 2k−1 个节点的二叉树。 图中二叉树的深度为4,叶子节点个数 2 4 − 1 15 2^4-115 24−115 1.2 完全二叉树
什么是完全二叉树
完全二叉树的定义如下在完全二叉树中除了最底层节点可能没填满外其余每层节点数都达到最大值并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h h h 层则该层包含 1 1 1~ 2 ( h − 1 ) 2^{(h-1)} 2(h−1) 个节点。
优先级队列其实是一个堆堆就是一棵完全二叉树同时保证父子节点的顺序关系。
1.3 二叉搜索树
二叉搜索树是一个有序树。
若它的左子树不空则左子树上所有结点的值均小于它的根结点的值若它的右子树不空则右子树上所有结点的值均大于它的根结点的值它的左、右子树也分别为二叉排序树
下面这两棵树都是搜索树:
1.4 平衡二叉搜索树
平衡二叉搜索树又被称为AVLAdelson-Velsky and Landis树且具有以下性质它是一棵空树或它的左右两个子树的高度差的绝对值不超过1并且左右两个子树都是一棵平衡二叉树。 如图 最后一棵 不是平衡二叉树因为它的左右两个子树的高度差的绝对值超过了 1 1 1。
2.二叉树的存储方式
二叉树可以链式存储也可以顺序存储。
那么链式存储方式就用指针 顺序存储的方式就是用数组。
顾名思义就是顺序存储的元素在内存是连续分布的而链式存储则是通过指针把分布在散落在各个地址的节点串联一起。
链式存储如图 顺序存储的方式如图
用数组来存储二叉树如何遍历的呢
如果父节点的数组下标是 i i i那么它的左孩子就是 i ∗ 2 1 i * 2 1 i∗21 右孩子就是 i ∗ 2 2 i * 2 2 i∗22。
但是用链式表示的二叉树更有利于我们理解所以一般我们都是用链式存储二叉树。
所以大家要了解用数组依然可以表示二叉树。
3.二叉树的遍历方式
二叉树主要有两种遍历方式
深度优先遍历先往深走遇到叶子节点再往回走。广度优先遍历一层一层的去遍历。
那么从深度优先遍历和广度优先遍历进一步拓展才有如下遍历方式
深度优先遍历 前序遍历递归法迭代法中序遍历递归法迭代法后序遍历递归法迭代法 广度优先遍历 层次遍历迭代法
这里前中后其实指的就是中间节点的遍历顺序
看如下中间节点的顺序就可以发现中间节点的顺序就是所谓的遍历方式
前序遍历中左右中序遍历左中右后序遍历左右中
二叉树中深度优先和广度优先遍历实现方式我们做二叉树相关题目经常会使用递归的方式来实现深度优先遍历也就是实现前中后序遍历使用递归是比较方便的。
之前我们讲栈与队列的时候就说过栈其实就是递归的一种是实现结构也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的。
而广度优先遍历的实现一般使用队列来实现这也是队列先进先出的特点所决定的因为需要先进先出的结构才能一层一层的来遍历二叉树。
4.二叉树的定义
class TreeNode: def __init__(self, value):self.value valueself.left Noneself.right None