二叉树
1、完全二叉树的递归创建
#define N 6
typedef char data_type;
typedef struct bitree{
int n;
data_type data;
struct bitree *lchild;
struct bitree *rchild;
}bitree_t;
//创建二叉树
bitree_t *create_bitree(int n){
bitree_t *root=NULL;
root=(bitree_t*)malloc(sizeof(bitree_t));
printf("please enter %d code num ",n);
scanf("%c",&(root->data));
//清除缓存区中的字符串--防止回车键读入
while(getchar()!='\n');
root->lchild=root->rchild=NULL;
if(2*n<=N){
root->lchild=create_bitree(2*n);
}
if(2*n+1<=N){
root->rchild=create_bitree(2*n+1);
}
return root;
}
2、二叉树的递归遍历
1、先序遍历
void preorder(bitree_t *t){
if(t==NULL) return;
printf("%c\n",t->data);
preorder(t->lchild);
preorder(t->rchild);
}
2、中序遍历
void inorder(bitree_t *t){
if(t==NULL)return;
inorder(t->lchild);
printf("%c\n",t->data);
inorder(t->rchild);
}
3、后序遍历
void postorder(bitree_t *t){
if(t==NULL) return;
postorder(t->lchild);
postorder(t->rchild);
printf("%c\n",t->data);
}
3、二叉树的非递归遍历
1、非递归的先序遍历
这里先定义一个链栈
typedef bitree_t* datatype;//修改data的值为二叉树的指针
typedef struct node{
struct node* next;
datatype data;
}linknode;
typedef struct{
linknode * head;
int n;
}link_stack;
void preorder(bitree_t *t){
bitree_t *temp=NULL;
temp=t;
link_stack *stack=create_link_stack();
while(temp!=NULL||!is_empty(stack)){
while(temp!=NULL){
printf("%c\n",temp->data);
push(stack,temp);//入栈
temp=temp->lchild;
}
if(!is_empty(stack)){
temp=pop(stack);//出栈
temp=temp->rchild;
}
}
}
2、非递归的中序遍历
void inorder(bitree_t *t){
bitree_t *temp=t;
link_stack *stack=create_link_stack();
while(temp!=NULL||!is_empty(stack)){
if(temp!=NULL){
push(stack,temp);
temp=temp->lchild;
}
else{
temp=pop(stack);
printf("%c\n",temp->data);
temp=temp->rchild;
}
}
}
3、非递归的后序遍历
void postorder(bitree_t *t){
bitree_t *pre=NULL;
bitree_t *cur=t;
link_stack *stack=create_link_stack();
push(stack,cur);
while(!is_empty(stack)){
cur=get_top_stack(stack);
//左右孩子都为空,或(左孩子被访问或右孩子被访问)
if((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
{
cur=pop(stack);
printf("%c\n",cur->data);
pre=cur;
}
else{
if(cur->rchild!=NULL) push(stack,cur->rchild);
if(cur->lchild!=NULL) push(stack,cur->lchild);
}
}
free(stack);
}