特殊的树状结构--二叉树
二叉树是n(n>=0)个结点的集合,该集合或者为空集(称为空二叉树),或者由一个结点和两棵互不相交的,分别称为根结点的左子树和右子树的二叉树组成。
二叉树的特点:
1,每个结点最多两棵子树,所以二叉树中不存在度大于2的结点
2,左子树和右子树是有顺序的,次序不能任意颠倒。
3,即便树中某结点只有一棵子树,也要区分他是左子树还是右子树。
二叉树的基本形态:
1,空二叉树。
2,只有一个根节点。
3,根节点只有左子树。
4,根节点只有右子树。
5,根节点既有左子树,又有右子树。
特殊二叉树:
1,斜树,只有左子树被称为左斜,只有右子树被称为右斜
2,满树,在一个二叉树中,如果所有分支结点都存在左右子树,并且所有叶子都在同一层上,这样的二叉树被称为满树。
3,完全二叉树,对一棵具有n个结点的二叉树按层序编号,如果编号为i(i<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二
叉树位置完全相同,则这棵二叉树称为完全二叉树。
满树一定是完全二叉树,但完全二叉树不一定为满树。
完全二叉树的特点:
1,叶子结点只能出现在最下两层。
2,最下层的叶子一定集中在左连续位置。(因为排序是按左先满)
3,倒数第二层,若有叶子结点,一定都在右部连续位置。
4,如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况。
5,同样结点树的二叉树,完全二叉树的深度最小。
二叉树的性质
1,第i层至多2^(i-1)个结点。
2,深度为k的二叉树至多有2^k-1个结点。
3,对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1.(n0+n1+n2-1=n1+2n2)
4,具有n个结点的完全二叉树的深度为[logn]+1;注意对于深度为k的二叉树,结点n范围一定为:2^(k-1)-1<n<2^k-1,否则不是完全二叉树。
5,如果对一棵有n个结点的完全二叉树的结点按层序编号1,对于任一结点i有:
①,如果i=1,则i结点是二叉树的根,无双亲;如果i>1,则其双亲是结点i/2.
②,如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i.
③,如果2i>n,则结点i无右孩子;否者其右孩子是结点2i+1.
二叉树的存储结构
一,顺序存储
虽然树用顺序存储比较困难,但二叉树是特殊的树,顺序储存也能实现。
用数组的下标体现其逻辑关系。若不是完全二叉树,就会出现浪费空间的现象,所以顺序存储一般只用于完全二叉树。
二,二叉链表
二叉树每个结点最多有俩个孩子,所以为它设计一个数据域和两个指针域,这样的链表,就叫做二叉链表。
typedef struct BiTNode //结点结构 { TElemType data; //结点数据 struct BiTNode *lchild,*rchild; //左右孩子指针 }BiTNode,*BiTree;
如果需要还可以增加一个指向其双亲的指针域,就变成了三叉链表
关于二叉树的遍历
二叉树的遍历是指从根节点出发,按照某种次序(类似一种递归操作)依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。
关键在于:访问和次序
访问,是指具体要对结点所作的操作
次序,如前,中,后三种
遍历方法
1,前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。
1 void PreOrderTraverse(BiTree T) 2 { 3 if(T==NULL) 4 return; 5 printf("%c",T->data);//这个的访问操作,为打印。 6 PreOrderTraverse(T->lchild);//进行递归操作 7 PreOrderTraverse(T->rchild);//进行递归操作 8 }
2,中序遍历:规则是若树为空,则空操作返回,否者从根节点开始(注意不是先访问根结点),中序遍历根结点的左子树,然后是访问根节点,最后中序遍历右子树
1 void InOrderTraverse(BiTree T) 2 { 3 if(T==NULL) 4 return; 5 InOrderTraverse(T->lchild);//递归,遍历左子树 6 printf("%c",T->data);//显示结点数据,相当于对此结点的访问 7 InOrderTraverse(T->rchild);//递归,遍历右子树 8 }
3,后序遍历:规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。
void PostOrderTraverse(BiTree T) { if(T==NULL) return; PostOrderTraverse(T->lchild);//后序遍历左子树 PostOrderTraverse(T->rchild);//后序遍历右子树 printf("%c",T->data);//访问结点内容 }
注意前中后,是指根结点的访问次序。
4,层序遍历:规则是若树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问,从上而下遍历,在同一层中,按从左到右的顺序对结点逐个访问。
由遍历结构推导其次序的步骤:
1,前序或后序确定根节点,//已知前序和后序,是没办法确定一颗二叉树的,因为不知道左子树和右子树。
2,中序根据根节点,确定根节点的左子树和右子树。
3,进行递归操作。
标签:左子,结点,遍历,复习,右子,访问,二叉树 From: https://www.cnblogs.com/abwork-space/p/17060317.html