一、特点
二叉树是树的特殊一种,具有如下特点:
1、每个结点最多有两颗子树,结点的度(子节点)最大为2。
2、左子树和右子树是有顺序的,次序不能颠倒。
3、即使某结点只有一个子树,也要区分左右子树。
二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。
二、存储方式
1、二叉数组
二叉树的顺序存储结构就是使用一维数组存储二叉树中的结点,并且结点的存储位置,就是数组的下标索引。
当二叉树不为完全二叉树时
2、二叉链表
1 typedef struct BiTNode{
2 TElemType data;//数据
3 struct BiTNode *lchild, *rchild;//左右孩子指针
4 } BiTNode, *BiTree;
三、二叉树遍历
1、前序遍历
从二叉树的根结点出发,当第一次到达结点时就输出结点数据,按照先向左在向右的方向访问。(根节点-左树-右树)
1 /*二叉树的前序遍历递归算法*/
2 void PreOrderTraverse(BiTree T)
3 {
4 if(T==NULL)
5 return;
6 cout<<( T->data); /*显示结点数据,可以更改为其他对结点操作*/
7 PreOrderTraverse(T->lchild); /*再先序遍历左子树*/
8 PreOrderTraverse(T->rchild); /*最后先序遍历右子树*/
9 }
2、中序遍历
从二叉树的根结点出发,当第二次到达结点时就输出结点数据,按照先向左在向右的方向访问。(左树-根节点-右树)
1 /*二叉树的中序遍历递归算法*/
2 void InOrderTraverse(BiTree T)
3 {
4 if(T==NULL)
5 return;
6 InOrderTraverse(T->lchild); /*中序遍历左子树*/
7 cout<<( T->data); /*显示结点数据,可以更改为其他对结点操作*/
8 InOrderTraverse(T->rchild); /*最后中序遍历右子树*/
9 }
3、后序遍历
从二叉树的根结点出发,当第三次到达结点时就输出结点数据,按照先向左在向右的方向访问。(左树-右树-根节点)
1 /*二叉树的后序遍历递归算法*/
2 void PostOrderTraverse(BiTree T)
3 {
4 if(T==NULL)
5 return;
6 PostOrderTraverse(T->lchild); /*先后序遍历左子树*/
7 PostOrderTraverse(T->rchild); /*再后续遍历右子树*/
8 cout<<( T->data); /*显示结点数据,可以更改为其他对结点操作*/
9 }
4、层序遍历
按照树的层次自上而下的遍历二叉树。
1 void Layer_order(BiTree * TNode,BiTree ** F,BiTree ** R)
2 {
3
4 *F=TNode; //将当前节点放入队列首指针所指位置
5 printf("%c ",(*F)->data);
6 if((*F)->lchild!=NULL)
7 {
8 R=R+1;
9 *R=(*F)->lchild; //节点的左儿子放入队尾
10 }
11 if((*F)->rchild!=NULL)
12 {
13 R=R+1; //首指针向后移动一格
14 *R=(*F)->rchild; //节点的右儿子放入队尾
15 }
16
17 if(F!=R)
18
19 {
20 F=F+1;
21 Layer_order(*F,F,R);//递归
22 }
前序遍历输出为:ABDHIEJCFG(根节点-左树-右树)
中序遍历输出为:HDIBJEAFCG(左树-根节点-右树)
后序遍历输出为:HIDJEBFGCA(左树-右树-根节点)
层次遍历结果为:ABCDEFGHIJ(自上而下)