二叉树

btree.h

#ifndef __BTREE_H__
#define __BTREE_H__

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


typedef struct NODE{
   
	int data;
	struct NODE*lchild;
	struct NODE*rchild;
}btreenode;

void btree_create(btreenode*BT);
void pre_order(btreenode*BT);
void mid_order(btreenode*BT);
void back_order(btreenode*BT);
void level_order(btreenode*BT);
void order(void (*pfun)(btreenode*BT),btreenode*BT);  //重要

btree.c

#include "btree.h"

static level = 0;
void btree_create(btreenode*BT)
{
   
	int temp;
	
	printf("\n(-1==stop;level = %d层)输入:",level);
	scanf("%d",&temp);
	if(temp == -1)
	{
   
		level = level-1;
		printf("\n退出一层:level = %d",level);

	}
	else
	{
   
		BT->lchild = (btreenode*)malloc(sizeof(btreenode));
		BT->rchild = (btreenode*)malloc(sizeof(btreenode));
		BT->data = temp;
		level = level+1;
		btree_create(BT->lchild); //注意:传递的指针不能三NULL指针,或则耶指针
		btree_create(BT->rchild);
	}
}

void pre_order(btreenode*BT)
{
   
	if(BT->data != 0) //0是节点默认值,说明该节点没有被附值
	printf("%d\t",BT->data);
	
	if(BT->rchild!=NULL)
	pre_order( BT->lchild );
	
	if(BT->rchild!=NULL)
	pre_order( BT->rchild );
}
void mid_order(btreenode*BT)
{
   
	if(BT->lchild!=NULL)
	pre_order( BT->lchild );
	
	if(BT->data != 0)
	printf("%d\t",BT->data);
	
	if(BT->rchild!=NULL)
	pre_order(BT->rchild);
}

void back_order(btreenode*BT)
{
   
	if(BT->lchild!=NULL)
	pre_order( BT->lchild );
	

	if(BT->rchild!=NULL)
	pre_order(BT->rchild);
	

	if(BT->data != 0)
	printf("%d\t",BT->data);
}

void order(void (*pfun)(btreenode*BT),btreenode*BT)
{
   
	pfun(BT);
}

btree_text.c

#include "btree.h"

void main()
{
   
	btreenode*BT;
	BT = (btreenode*)malloc(sizeof(btreenode));
	printf("\n--根节点 == level0\n");
	btree_create(BT);
	printf("\n先序排序:");
	order(pre_order,BT);
	printf("\n中序排序:");
	order(mid_order,BT);
	printf("\n后序排序:");
	order(back_order,BT);
}

Makefile

VPATH=/home/yqj/单链表/

btree_text:btree.o btree_text.c
	gcc -g btree.o btree_text.c -o btree_text
btree.o:btree.c btree.h
	gcc -g btree.c -c -o btree.o

.PHONY:clean
clean:
	rm -rf btree.o btree_tex

运行结果

/* 建立如下所示的二叉树 1 2 5 3 4 6 7 */
root@ubuntu:/home/yqj/desktop/二叉树# ./btree_text 
--根节点 == level0
(-1==stop;level = 0)输入:1
(-1==stop;level = 1)输入:2
(-1==stop;level = 2)输入:3
(-1==stop;level = 3)输入:-1
退出一层:level = 2
(-1==stop;level = 2)输入:4
(-1==stop;level = 3)输入:-1
退出一层:level = 2
(-1==stop;level = 2)输入:-1
退出一层:level = 1
(-1==stop;level = 1)输入:-1
退出一层:level = 0
(-1==stop;level = 0)输入:5
(-1==stop;level = 1)输入:6   
(-1==stop;level = 2)输入:-1
退出一层:level = 1
(-1==stop;level = 1)输入:7
(-1==stop;level = 2)输入:-1
退出一层:level = 1
(-1==stop;level = 1)输入:-1
退出一层:level = 0
(-1==stop;level = 0)输入:-1
退出一层:level = -1
先序排序:1	2	3	4	5	6	7	
中序排序:2	3	4	1	5	6	7	
后序排序:2	3	4	5	6	7	1