目录
一、树与二叉树的原理解析
1、树的定义
树是n(n>=0)个结点的有限集。当n=0时,称为空树。
在任意一棵非空树中应满足:
1)有且仅有一个特定的结点称为根的结点。
2)当n>1时,其余结点可以分为m(m>0)个互不相交的有限集T1,T2,......,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
2、树的结构和特点
树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
1)树的根节点没有前驱,除根结点外的所有结点有且仅有一个前驱。
2)树中所有结点可以有零个或多个后继。
3、二叉树的定义
二叉树是另一种树形结构。其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于二的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。
与树相似,二叉树也以递归的形式定义。二叉树是n(n>=0)个结点的有限集合:
1)或者为空二叉树,即n=0;
2)或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成,左子树和右子树又分别是一个二叉树。
4、树结点的数据结构
typedef char BiElemType;
typedef struct BiTNode{
BiElemType c;//c就是data
struct BiTNode *lchild; //左孩子
struct BiTNode *rchild; //右孩子
}BiTNode,*BiTree;
树中任何一个结点都是一个结构体,它的空间我们是通过malloc申请出来
二、二叉树的层次建树
1、二叉树层次建树的原理及分析
首先,我们需要一个辅助队列来帮助我们指向结点的地址值,从而帮助我们更好的输入二叉树里面的结点值。
流程我画图给大家解释:
1)开始时树的根节点为空,并且辅助队列也为空。
2)我们将a赋给根节点和入队,并让辅助结点中的头尾节点指向a,pcur负责帮助我们了解现在二叉树应当判断左右孩子结点的父结点位置。
3)我们判断a结点是否有左孩子,如果有尾插法入队,是否有右孩子,如果有尾插法入队(左、右顺序不能颠倒),当右孩子入队完成后,我们要将指针指向左孩子(将pcur指向队列中的后一位值,即b)
4)后面结点,同样套路判断和移动。
2、完整代码
为了提高代码的编写效率,我们把结构体类型的声明放入 function.h 头文件,function.h 头文件在 main.cpp 进行了 include,最终树建的对不对,我们可以通过单步调试来看树的 结果,断点打在 return 0 位置,下面直接上代码
function.h 代码如下