先序遍历:
规则:若二叉树为空,则空操作返回,否则先访问根节点,然后先序遍历左树,在先序遍历右树
中序遍历
规则:若树为空,则空操作返回,否则从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树
后序遍历
规则:若树为空,则空返回操作,否则从左到右先叶子后节点的方式遍历访问左右子树,最后是访问根节点
层序遍历
规则:若树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序节点逐个访问
注意:本文未实现层序遍历
层序遍历:https://blog.csdn.net/qq_29542611/article/details/79372678
代码如下
/*
**二叉树
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
char data;
struct node *Rchild;
struct node *Lchild;
}*TreeNode,adNode;
//建立二叉树
void CreateTree(TreeNode &bt){
char da;
scanf("%c",&da);
getchar();
if(da=='#'){
bt=NULL;
}else{
bt=(adNode *)malloc(sizeof(node));
bt->data=da;
printf("输入%c的左子树的值: ",bt->data);
CreateTree(bt->Lchild);
printf("输入%c的右子树的值: ",bt->data);
CreateTree(bt->Rchild);
}
}
//先序遍历
void Preorder(TreeNode root){
if(root){
printf("%c ",root->data);
Preorder(root->Lchild);
Preorder(root->Rchild);
}
}
//中序遍历
void InOrder(TreeNode root){
if(root){
InOrder(root->Lchild);
printf("%c ",root->data);
InOrder(root->Rchild);
}
}
//后序遍历
void PostOrder(TreeNode root){
if(root){
PostOrder(root->Lchild);
PostOrder(root->Rchild);
printf("%c ",root->data);
}
}
int main(){
TreeNode tn;
CreateTree(tn);
printf("先序遍历: ");
Preorder(tn);
printf("\n中序遍历: ");
InOrder(tn);
printf("\n后序遍历: ");
PostOrder(tn);
return 0;
}