树_二叉树
一、特点
二叉树是树的特殊一种,具有如下特点:
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(自上而下)