什么是树
- 树的定义:树是n个(n>=0)有限节点组成一个具有层次关系的集合。
- 根及子树:在任意一个非空树中,有且仅有一个特定的称为根的结点,当n>1时,其余结点又可以分为m(m>0)个互不相交的有限集T1,T2,…Tm,其中每一个集合本身又是一颗树,并称为根的子树。
数的基本术语:
- 结点:树中包含一个数据元素和若干指向其子树的分支的集合叫做树的结点
- 度:结点拥有的子树称为结点的度
- 叶子(终端结点):度为0的结点称为终端结点或者是叶子
- 分支结点(非终端结点):度不为0的结点称为分支结点或者是非终端结点。
- 孩子/双亲/兄弟:结点的子树称为该结点的孩子,相应的,该结点称为孩子的双亲,同一个双亲的孩子互称兄弟。
- 祖先/子孙结点的祖先是从根到该节点所经过的分支上的所有结点,反之,以某结点为根的子树中的任意结点都是该节点的子孙。
- 结点的层次:结点的层次从根开始算起,根为第一层,根的孩子为第二层…..
- 树的深度:树中结点的最大层次称为树的深度或者是高度
- 有序树/无序树:如果树中结点的各子树看成从左到右是有次序的(不能互换),则树称为有序树,否则称为无序树。
- 森林: m(m>=0)颗互不相交的树的集合
什么是二叉树
- 二叉树(Binary Tree)是n(n大于0)个结点所构成的集合,它或为空树,或为非空树。
- 有且仅有一个称之为根的结点。
- 除根结点外的其他结点分为两个互不相交的子集,分别称为左子树和右子树,并且都是二叉树。
- 一颗深度为k且有2k−1个结点的树称为满二叉树
- 完全二叉树:深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。
- 二叉树的性质
- 在二叉树的第i层上最多有2(i−1)个结点(i>=1)
- 深度为k的二叉树最多有2k−1个结点(k>=1)
- 对任何一个二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
二叉树的存储结构
(这里只介绍链式存储)
typedef struct BiTNode
{
char data;//结点存储的值
struct BiTNode *lchild,*rchild;//分别为指向左子树和右子树的结构体的指针。
}BiTNode,*BiTree;
二叉树的遍历
- 前序遍历:先序遍历是先输出根节点,再输出左子树,最后输出右子树。
- 中序遍历:中序遍历是先输出左子树,再输出根节点,最后输出右子树。
- 后序遍历:后序遍历是先输出左子树,再输出右子树,最后输出根节点。
可结合下图分析:
编码实现
(对于遍历可以使用递归方法,也可以使用非递归方法,这里使用递归的方法)
#include <stdio.h>
#include <stdlib.h>
#define Elemtype int
int m,n;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void Tree_creat(BiTree *T)
{
char ch;
scanf("%c",&ch);
if('#'==ch)
{
*T=NULL;
}
else{
*T=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=ch;
Tree_creat(&(*T)->lchild);
Tree_creat(&(*T)->rchild);
}
}
void visit(char data,int level)
{
printf("this is %d,data is %c\n",level,data);//打印该结点所在层和值。
}
//前序遍历
void PreOrderTraverse(BiTree T,int level){
if(T)
{
visit(T->data,level);//对结点进行相关操作
PreOrderTraverse(T->lchild,level+1);//递归遍历左子树
PreOrderTraverse(T->rchild,level+1);//递归遍历右子树
}
}
//计算二叉树的深度
int BiTreeDepth(BiTree T)
{
if(T==NULL)
return 0;
else
{
m=BiTreeDepth(T->lchild);
n=BiTreeDepth(T->rchild);
if(m>n)
return m+1;
else
return n+1;
}
}
int main()
{
int level=1;
BiTNode* T;
printf("'#' === NULL\n");
Tree_creat(&T);//创建二叉树
PreOrderTraverse(T,level);//前序遍历二叉树
printf("depth=%d\n",BiTreeDepth(T));
return 0;
}
对于上图运行: