06 -- 二叉树

二叉树

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	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值