树是 n(n>=0)个结点的有限集,当n = 0时,就被称为空树。
很明显,通过分析,我们也发现几个结论。1.树的根结点没有前驱。2.每个结点有且只有一个前驱。3.每个结点可以有零个或很多个后继。
树和子树:以根结点为根的树为全树,以其他结点作为根结点的树为子树
结点的度:表示当前结点拥有的分支个数
树的度:就是当前树结点最多拥有的度
叶子结点:度为0的结点就是叶子结点,它位于树最深层
树根结点:每一个非空树都有且只有一个被称为根的结点。此外如果一个结点没有父结点,那么这个结点就是整棵树的根结点
父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点
子结点:一个结点含有的子树的根结点称为该结点的子结点
祖先:对任意结点x,从根结点到结点x的所有结点都是x的祖先(结点x也是自己的祖先)
子孙:对任意结点x,从结点x到叶子结点的所有结点都是x的子孙(结点x也是自己的子孙)
兄弟结点:拥有共同父结点的结点互称为兄弟结点
路径:从一个结点到另一个结点之间的边和结点构成路径
层次:树根开始定义,根结点为第1层,它的子结点为第2层,以此类推
结点的深度:对任意结点x,x结点的深度表示为根结点到x结点的路径长度。所以根结点深度为0,第二层结点深度为1
树的深度:类似树的度对应于结点的度一样,最深的结点的深度
结点高度:对任意结点x,叶子结点到x结点的路径长度就是结点x的高度
森林:由 m (m >= 0)个互不相交的树组成的集合被称为森林。(上图以B,C为根节点的两棵子树就可以被称为森林)
typedef struct BiTNode{
TElemType data;//存放数据
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
访问根节点;
访问当前节点的左子树;
若当前节点无左子树,则访问当前节点的右子树;
#include
#include
#define TElemType int
typedef struct BiTNode{
TElemType data;//数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
void visit(BiTNode* elem){
printf("%d ",elem->data);
}
void PreOrder(BiTree T){
if(T != NULL){
visit(T); //访问根节点
PreOrder(T->lchild); //递归遍历左子树
PreOrder(T->rchild); //递归遍历右子树
}
return ;
}//仅展示部分代码
访问当前节点的左子树;
访问根节点;
访问当前节点的右子树;
#include
#include
#define TElemType int
typedef struct BiTNode{
TElemType data;//数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
void visit(BiTNode* elem){
printf("%d ",elem->data);//把遍历完成的数输出来
}
void PreOrder(BiTree T){
if(T != NULL){
PreOrder(T->lchild); //递归遍历左子树
visit(T); //访问根节点
PreOrder(T->rchild); //递归遍历右子树
}
return ;
}//仅展示部分代码
从根节点出发,依次遍历各节点的左右子树。
直到当前节点左右子树遍历完成后,才访问该节点元素。
#include
#include
#define TElemType int
typedef struct BiTNode{
TElemType data;//数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
void visit(BiTNode* elem){
printf("%d ",elem->data);//把遍历完成的数输出来
}
void PreOrder(BiTree T){
if(T != NULL){
PreOrder(T->lchild); //递归遍历左子树
PreOrder(T->rchild); //递归遍历右子树
visit(T); //访问根节点
}
return ;