首页 > 其他 > 详细

二叉树的基本操作

时间:2014-02-11 01:00:56      阅读:299      评论:0      收藏:0      [点我收藏+]
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <assert.h>

#define TRUE 1
#define FALSE 0


typedef int datatype;
typedef struct node
{
	datatype data;
	struct node *lchild, *rchild;
}btree;

void creat_btree(btree **bt);
void preorder_btree(btree *bt);
void inorder_btree(btree *bt);
void postorder_btree(btree *bt);
int depth_btree(btree *bt);
void free_btree(btree **bt);
int find_btree(btree *bt, datatype x);
void exchange_btree(btree *bt);
void travel_btree(btree *bt);

int main (int argc, char *argv[])
{
	btree *bt = NULL;
	creat_btree(&bt);
	preorder_btree(bt);
	putchar(‘\n‘);
	/*
	inorder_btree(bt);
	putchar(‘\n‘);
	printf("%d\n",depth_btree(bt));
	free_btree(&bt);
	preorder_btree(bt);
	putchar(‘\n‘);
	*/
	exchange_btree(bt);
	preorder_btree(bt);
	putchar(‘\n‘);
	travel_btree(bt);
	putchar(‘\n‘);
	//printf("%d\n",find_btree(bt,8));
	return 0;
}

void creat_btree(btree **bt)
{
	int n;
	scanf("%d",&n);
	if(n == 0){
		return;
	}
	else{
		*bt = (btree*)malloc(sizeof(btree));
		(*bt)->data = n;
		(*bt)->lchild = NULL;
		(*bt)->rchild = NULL;
		
		creat_btree(&(*bt)->lchild);
		creat_btree(&(*bt)->rchild);
	}
}

void preorder_btree(btree *bt)//前序遍历
{
	if(bt != NULL){
		printf("%d,",bt->data);
		preorder_btree(bt->lchild);
		preorder_btree(bt->rchild);
	}
}

void inorder_btree(btree *bt)//中序遍历
{
	if(bt != NULL){
		inorder_btree(bt->lchild);
		printf("%d,",bt->data);
		inorder_btree(bt->rchild);
	}
}

void postorder_btree(btree *bt)//后序遍历
{
	if(bt != NULL){
		postorder_btree(bt->lchild);
		postorder_btree(bt->rchild);
		printf("%d,",bt->data);
	}
}

//树的先序遍历非递归算法
/*
	if(跟不空){
		根入栈;
	}
	while(栈不空){
		出栈;
		访问出栈节点;
		右子树入栈;
		左子树入栈;
	}
*/

void travel_btree(btree *bt)//栈实现二叉数的遍历
{
	btree* stack[50];
	btree* temp;
	int top = 0;
	if(bt){
		stack[top] = bt;
		top++;
	}
	while(top > 0){
		top--;
		temp = stack[top];
		printf("%d,",stack[top]->data);
		
		if(temp->rchild != NULL){
			stack[top] = temp->rchild;
			top++;
		}
		
		if(temp->lchild != NULL){
			stack[top] = temp->lchild;
			top++;
		}
	}
}
int depth_btree(btree *bt)//二叉树深度
{
	int ldepth = 0, rdepth = 0;
	if(bt == NULL)
		return 0;
	ldepth = depth_btree(bt->lchild)+1;
	rdepth = depth_btree(bt->rchild)+1;
	return ldepth >= rdepth ? ldepth : rdepth;
}

void free_btree(btree **bt)//释放二叉树
{
	if(*bt != NULL){
		free_btree(&(*bt)->lchild);
		free_btree(&(*bt)->rchild);
		free(*bt);
		*bt = NULL;
	}
}

int find_btree(btree *bt, datatype x)//查找二叉树中是否有某个节点
{	
	if(bt != NULL){	
		if(x == bt->data){
			return TRUE;
		}
		else{ 	
			if(find_btree(bt->lchild,x) || find_btree(bt->rchild,x))
				return TRUE;
			return FALSE;	
		}	
	}	
}

void exchange_btree(btree *bt)//交换二叉数
{
	btree* temp;
	if(bt != NULL){
		exchange_btree(bt->lchild);
		exchange_btree(bt->rchild);
		temp = bt->lchild;
		bt->lchild = bt->rchild;
		bt->rchild = temp;
	}	
}


二叉树的基本操作

原文:http://blog.csdn.net/a987860319/article/details/19046763

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!