树是n(n ≥ 0)个节点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:
1)有且仅有一个特定的称为根的结点。2)当n > 1时,其余节点可分为m(m > 0)个
互不相交的有限集T1, T2,…, Tm,其中每个集合本身又是一棵树,并且称为根的子树。
树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
1)树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。2)树中所有结点可以有零个或多个后继。
结构如图所示:
二叉树
二叉树的定义
二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。与树相似,二叉树也以递归的形式定义。二叉树是n(n ≥ 0)个结点的有限集合:
① 或者为空二叉树,即n = 0。
② 或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
满二叉树是指从左往右没有空位
二叉树的顺序存储
二叉树的顺序存储
树节点的数据结构
typedef char BiElemType;
typedef struct BiTNode {
BiElemType c;//c就是书上的data
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, * BiTree;
树中任何一个结点都是一个结构体,它的空间我们是通过malloc申请出来
二叉树的层次建树
1.定义树节点
typedef char BiElemType;
typedef struct BiTNode {
BiElemType c;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, * BiTree;
还要建一个辅助队列用来确定插入元素的位置
//tag 结构体是辅助队列使用的
typedef struct tag {
BiTree p;//树的某一个结点的地址值
struct tag* pnext;
}tag_t, * ptag_t;
代码实现
int main()
{
BiTree pnew;//用来指向新申请的树结点
char c;
BiTree tree = NULL;//树根
//phead 就是队列头,ptail 就是队列尾
ptag_t phead = NULL, ptail = NULL, listpnew = NULL, pcur = NULL;
//输入内容为 abcdefghij
while (scanf("%c", &c))
{
if (c == '\n')
{
break;
}
pnew = (BiTree)calloc(1, sizeof(BiTNode));//calloc 申请空间并对空间进行初始化,赋值为 0
pnew->c = c;//数据放进去
listpnew = (ptag_t)calloc(1, sizeof(tag_t));//给队列结点申请空间
listpnew->p = pnew;
if (NULL == tree)
{
tree = pnew;//树的根
phead = listpnew;//队列头
ptail = listpnew;//队列尾
pcur = listpnew;
continue;
}
else {
ptail->pnext = listpnew;//新结点放入链表,通过尾插法
ptail = listpnew;//ptail 指向队列尾部
}//pcur 始终指向要插入的结点的位置
if (NULL == pcur->p->lchild)//如何把新结点放入树
{
pcur->p->lchild = pnew;//把新结点放到要插入结点的左边
}
else if (NULL == pcur->p->rchild)
{
pcur->p->rchild = pnew;//把新结点放到要插入结点的右边
pcur = pcur->pnext;//左右都放了结点后,pcur 指向队列的下一个
}
}
return 0;
}