一、特点

二叉树是树的特殊一种,具有如下特点:

1、每个结点最多有两颗子树,结点的度(子节点)最大为2。
2、左子树和右子树是有顺序的,次序不能颠倒。
3、即使某结点只有一个子树,也要区分左右子树。

二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。

 

二叉树的数据结构java 二叉树的数据结构特点_算法

 二、存储方式

1、二叉数组

二叉树的顺序存储结构就是使用一维数组存储二叉树中的结点,并且结点的存储位置,就是数组的下标索引。

二叉树的数据结构java 二叉树的数据结构特点_二叉树_02

二叉树的数据结构java 二叉树的数据结构特点_二叉树_03

 

 

当二叉树不为完全二叉树时

 

二叉树的数据结构java 二叉树的数据结构特点_结点_04

二叉树的数据结构java 二叉树的数据结构特点_算法_05

 

 2、二叉链表

1 typedef struct BiTNode{
2     TElemType data;//数据
3     struct BiTNode *lchild, *rchild;//左右孩子指针
4 } BiTNode, *BiTree;

二叉树的数据结构java 二叉树的数据结构特点_算法_06

三、二叉树遍历

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     }

 

二叉树的数据结构java 二叉树的数据结构特点_子树_07

 

 

 

前序遍历输出为:ABDHIEJCFG(根节点-左树-右树)

中序遍历输出为:HDIBJEAFCG(左树-根节点-右树)

后序遍历输出为:HIDJEBFGCA(左树-右树-根节点)

层次遍历结果为:ABCDEFGHIJ(自上而下)