二叉树相关操作
节点下的子树不大于2即可
左子树和右子树有顺序,顺序不能颠倒
头文件、自定义数据类型以及自定义变量
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef int Status;
#define ERROR 0
#define OK 1
二叉树的存储结构(二叉链表)
typedef struct BiTNode{
ElemType data; //当前节点数据
struct BiTNode *LChild; //指向左子树
struct BiTNode *RChild; //指向右子树
}BiTNode, *BiTree;
创建二叉树(先序)
注:先序、中序、后序指的是根节点所在顺序
输入“#”时指针置空,说明此分支已到达叶节点
叶节点下左右指针均需置空,因此需要两次“#”置空才能退回上一级函数
void TreeCreate(BiTree &T,int n){
char a;
printf("请输入第%d层的一个数据\n",n);
scanf("%c",&a);
getchar();
n=n+1;
if(a=='#'){
T=NULL;
}
else{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=a;
TreeCreate(T->LChild,n);
TreeCreate(T->RChild,n);
}
}
二叉树遍历
从根节点出发,按照某种次序依次访问二叉树中所有节点
使得每个节点被且仅被访问一次
先序遍历(从根开始)
根
左
右
中序遍历(从叶开始)
左
根
右
后序遍历(从叶开始 )
左
右
根
层序遍历(从上到下,从左到右)
先序遍历
void TreeErgodic1(BiTree &T,int level){
if(T){
visit(T->data,level);
TreeErgodic1(T->LChild,level+1);
TreeErgodic1(T->RChild,level+1);
}
}
中序遍历
void TreeErgodic2(BiTree &T,int level){
if(T){
TreeErgodic2(T->LChild,level+1);
visit(T->data,level);
TreeErgodic2(T->RChild,level+1);
}
}
后序遍历
void TreeErgodic3(BiTree &T,int level){
if(T){
TreeErgodic3(T->LChild,level+1);
TreeErgodic3(T->RChild,level+1);
visit(T->data,level);
}
}
访问到节点后的具体操作
void visit(char a,int level){
printf("%c在第%d层\n",a,level);
}
主函数
int main(){
int n=1;
int level=1; //当前层次
int i=0;
BiTree T=NULL;
TreeCreate(T,n);
printf("树已经种上了\n");
printf("采用哪种遍历方式?\n");
printf("1:先序遍历\n");
printf("2:中序遍历\n");
printf("3:后序遍历\n");
scanf("%d",&i);
switch(i){
case 1:
TreeErgodic1(T,level);
break;
case 2:
TreeErgodic2(T,level);
break;
case 3:
TreeErgodic3(T,level);
break;
}
return 0;
}