首先,我们要了解一下,二叉树三种遍历算法的定义:
1.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
2.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
示例二叉树:
首先,我们要先建立起这棵二叉树,这个难度不大,仿造链表的初始化和加入元素操作即可,二叉树比链表多了一个指针,链式存储也称为“二叉链表”的形式。因此我们根据以上遍历的递归算法定义,可得出以下完整代码:
#include<cstdio>
#include<cstdlib>
typedef struct node Node;
struct node{
Node *lchild,*rchild; //分别指向节点的左孩子和右孩子
char data; //用于节点存放数据
};
Node *Creat_node(Node *L,char _data){ //用于建立一棵二叉树,为这棵二叉树的每个节点的数据域以及指针域赋值
L = (Node *)malloc(sizeof(Node));
L -> lchild = NULL;
L -> rchild = NULL;
L -> data = _data; //初始化
return L;
}
Node *Build(Node *root){ //建立一棵二叉树的过程
root = Creat_node(root,'1');
root -> lchild = Creat_node(root -> lchild,'2');
root -> rchild = Creat_node(root -> rchild,'3');
root -> lchild -> lchild = Creat_node(root -> lchild -> lchild,'4');
root -> lchild -> rchild = Creat_node(root -> lchild -> rchild,'5');
root -> rchild -> rchild = Creat_node(root -> rchild -> rchild,'6');
return root;
}
//先序遍历函数
/*遍历顺序:
*⑴ 访问根结点;
*⑵ 遍历左子树;
*⑶ 遍历右子树。
*/
void preorder(Node *root){
if(root){ //当前"根"节点不为空则输出根节点的数据域
printf("%c ",root -> data);
}
if(root -> lchild){ //如果当前根节点的左孩子不为空的话
preorder(root -> lchild); //那么将当前根节点的左孩子作为新的"根节点",然后重复递归调用先序遍历函数
//直到root -> lchild为空时,那么开始遍历root -> rchild是否为空
}
if(root -> rchild){ //当左孩子遍历结束之后,开始遍历当前根节点的右孩子,如果当前根节点的左孩子不为空的话
preorder(root -> rchild); //那么将当前根节点的右孩子作为新的"根节点",然后重复递归调用先序遍历函数
//直到root -> rchild为空时,表示该层遍历结束,函数返回上一层
}
}
//中序遍历函数
/*遍历顺序:
*⑴遍历左子树;
*⑵访问根结点;
*⑶遍历右子树。
*/
//遍历分析过程与先序遍历类似
void inorder(Node *root){
if(root -> lchild){
inorder(root -> lchild);
}
if(root){
printf("%c ",root -> data);
}
if(root -> rchild){
inorder(root -> rchild);
}
}
//后序遍历函数
/*遍历顺序:
*⑴遍历左子树;
*⑵遍历右子树;
*⑶访问根结点。
*/
//遍历分析过程与先序遍历类似
void postorder(Node *root){
if(root -> lchild){
postorder(root -> lchild);
}
if(root -> rchild){
postorder(root -> rchild);
}
if(root){
printf("%c ",root -> data);
}
}
int main(){
Node *root; //用来表示二叉树的根节点
root = Build(root); //建树完成,root作为根节点的树
printf("先序遍历的结果为:\n");
preorder(root); //先序遍历
printf("\n");
printf("中序遍历的结果为:\n");
inorder(root); //中序遍历
printf("\n");
printf("后序遍历的结果为:\n");
postorder(root); //后序遍历
printf("\n");
return 0;
}
二叉树属于数据结构中的重点部分,要多花时间琢磨。
如有错误,还请指正,O(∩_∩)O谢谢