数据结构 -- 二叉树

      这篇文章介绍的是经典的数据结构--二叉树,在这篇文章里介绍了几乎二叉树的所有操作。

      二叉树给我们最重要的印象莫过于递归,因为这棵树就是递归的,所以,我在解决各个问题时大部分都用到了递归,代码简单且易于理解,好吧,这篇文章的代码有点长,贴出来吧:

头文件:

/*
 * dlut_bitree.h
 *
 *  Created on: 2014年1月13日
 *      Author: DLUTBruceZhang
 */

#ifndef DLUT_BITREE_H_
#define DLUT_BITREE_H_

#include <stdio.h>

typedef		int			need;

#define		EMPTY			1
#define		NOT_EMPTY		0

typedef struct _bitree
{
	need data;
	struct _bitree *lchild;
	struct _bitree *rchild;
}bitree;

void		dlut_bitree_init(bitree **t);
void 		dlut_bitree_create(bitree **t);
int			dlut_bitree_empty(bitree *t);

void		dlut_bitree_recursion_preorder_traverse(bitree *t);
void		dlut_bitree_recursion_inorder_traverse(bitree *t);
void		dlut_bitree_recursion_backorder_traverse(bitree *t);

void		dlut_bitree_preorder_traverse(bitree *t);
void		dlut_bitree_inorder_traverse(bitree *t);
void		dlut_bitree_backorder_traverse(bitree *t);
void		dlut_bitree_backorder2_traverse(bitree *t);

void 		dlut_bitree_level_traverse(bitree *t);

int			dlut_bitree_node_count(bitree *t);
int			dlut_bitree_leaf_node_count(bitree *t);

int 		dlut_bitree_depth(bitree *t);

void		dlut_bitree_find_data(bitree *t, need, bitree **);
int			dlut_bitree_find_max(bitree *t);
int			dlut_bitree_find_min(bitree *t);
void		dlut_bitree_find_its_lchild(bitree *t, need);
void		dlut_bitree_find_its_rchild(bitree *t, need);
void		dlut_bitree_find_its_parent(bitree *t, need);
void		dlut_bitree_find_its_lbrother(bitree *t, need);
void		dlut_bitree_find_its_rbrother(bitree *t, need);

bitree *	dlut_bitree_copy_the_bitree(bitree *t);
void		dlut_bitree_exchange_l_r(bitree **t);
int			dlut_bitree_is_equal(bitree *t1, bitree *t2);

void		dlut_bitree_destory_left(bitree **t);
void		dlut_bitree_destory_right(bitree **t);
void 		dlut_bitree_destory(bitree **t);

#endif /* DLUT_BITREE_H_ */


C文件:

/*
 * dlut_bitree.c
 *
 *  Created on: 2014年1月13日
 *      Author: DLUTBruceZhang
 */


#include "dlut_bitree.h"
#include "dlut_stack.h"
#include <stdlib.h>

void dlut_bitree_init(bitree **t)
{
	*t = NULL;

	return;
}

void dlut_bitree_create(bitree **t)
{
	need data;

	printf("please input the prev data : \n");

	scanf("%d", &data);

	if (data == -1)
		*t = NULL;
	else
	{
		*t = (bitree *)malloc(sizeof(bitree));

		if (!*t)
			return;

		(*t) -> data = data;

		dlut_bitree_create(&((*t) -> lchild));
		dlut_bitree_create(&((*t) -> rchild));
	}
}

int dlut_bitree_empty(bitree *t)
{
	return t == NULL ? EMPTY : NOT_EMPTY;
}

void dlut_bitree_recursion_preorder_traverse(bitree *t)
{
	if (t)
	{
		printf("%d  ", t -> data);

		dlut_bitree_recursion_preorder_traverse(t -> lchild);
		dlut_bitree_recursion_preorder_traverse(t -> rchild);
	}

	return;
}

void dlut_bitree_recursion_inorder_traverse(bitree *t)
{
	if (t)
	{
		dlut_bitree_recursion_inorder_traverse(t -> lchild);

		printf("%d  ", t -> data);

		dlut_bitree_recursion_inorder_traverse(t -> rchild);
	}

	return;
}

void dlut_bitree_recursion_backorder_traverse(bitree *t)
{
	if (t)
	{
		dlut_bitree_recursion_backorder_traverse(t -> lchild);
		dlut_bitree_recursion_backorder_traverse(t -> rchild);

		printf("%d  ", t -> data);
	}

	return;
}

void dlut_bitree_preorder_traverse(bitree *t)
{
	bitree *stack[20];

	int top = -1;

	bitree *_t = t;

	while (_t || top != -1)
	{
		while (_t)
		{
			printf("%d  ", _t -> data);

			stack[++top] = _t;

			_t = _t -> lchild;
		}

		if (top != -1)
		{
			_t = stack[top--];

			_t = _t -> rchild;
		}
	}

	printf("\n");

	return;
}

void dlut_bitree_inorder_traverse(bitree *t)
{
	bitree *stack[20];

	int top = -1;

	bitree *_t = t;

	while (_t || top != -1)
	{
		while (_t)
		{
			stack[++top] = _t;

			_t = _t -> lchild;
		}

		if (top != -1)
		{
			_t = stack[top--];

			printf("%d  ", _t -> data);

			_t = _t -> rchild;
		}
	}

	printf("\n");

	return;
}

void dlut_bitree_backorder_traverse(bitree *t)
{
	bitree *_t = t;

	bitree *have_visited = NULL;

	bitree *stack[20];

	int top = -1;

	while (_t || top != -1)
	{
		while (_t)
		{
			stack[++top] = _t;

			_t = _t -> lchild;
		}

		_t = stack[top];

		if (_t -> rchild == NULL || _t -> rchild == have_visited)
		{
			printf("%d  ", _t -> data);

			have_visited = _t;

			top--;

			_t = NULL;
		}
		else
		{
			_t = _t -> rchild;
		}
	}

	printf("\n");

	return;
}

void dlut_bitree_backorder2_traverse(bitree *t)
{
	bitree *_t = t;

	bitree *stack1[20], *stack2[20];

	int top1 = -1, top2 = -1;

	stack1[++top1] = _t;

	while (top1 != -1)
	{
		_t = stack1[top1--];

		stack2[++top2] = _t;

		if (_t -> lchild)
		{
			stack1[++top1] = _t -> lchild;
		}

		if (_t -> rchild)
		{
			stack1[++top1] = _t -> rchild;
		}
	}

	while (top2 != -1)
	{
		printf("%d  ", stack2[top2--] -> data);
	}

	printf("\n");

	return;
}

void dlut_bitree_level_traverse(bitree *t)
{
	bitree *_t = t;

	bitree *queue[20];

	int count = -1;

	int cur_pos = -1;

	if (_t)
	{
		printf("%d  ", _t -> data);

		queue[++count] = _t;
	}

	while (count != cur_pos)
	{
		_t = queue[++cur_pos];

		if (_t -> lchild)
		{
			printf("%d  ", _t -> lchild -> data);

			queue[++count] = _t -> lchild;
		}

		if (_t -> rchild)
		{
			printf("%d  ", _t -> rchild -> data);

			queue[++count] = _t -> rchild;
		}
	}

	printf("\n");

	return;
}

int dlut_bitree_node_count(bitree *t)
{
	static int count = 0;

	if (t)
	{
		count++;

		dlut_bitree_node_count(t -> lchild);

		dlut_bitree_node_count(t -> rchild);
	}

	return count;
}

int dlut_bitree_leaf_node_count(bitree *t)
{
	static int count = 0;

	if (t)
	{
		if (!t -> lchild && !t -> rchild)
			count++;

		dlut_bitree_leaf_node_count(t -> lchild);

		dlut_bitree_leaf_node_count(t -> rchild);
	}

	return count;
}

int dlut_bitree_depth(bitree *t)
{
	int d1 = 0, d2 = 0;

	if (!t)
		return 0;

	d1 = dlut_bitree_depth(t -> lchild);

	d2 = dlut_bitree_depth(t -> rchild);

	return d1 > d2 ? d1 + 1 : d2 + 1;
}

void dlut_bitree_find_data(bitree *t, need data, bitree **td)
{
	if (!t)
		return ;
	else
	{
		if (t -> data == data)
		{
			*td = t;
		}

		dlut_bitree_find_data(t -> lchild, data, td);

		dlut_bitree_find_data(t -> rchild, data, td);
	}
}

int dlut_bitree_find_max(bitree *t)
{
	static int max;

	static int flag = 0;

	if (!t)
		return -1;

	if (!flag  || t)
	{
		if (!flag)
		{
			max = t -> data;

			flag++;
		}

		if (t -> data > max)
		{
			max = t -> data;
		}

		dlut_bitree_find_max(t -> lchild);

		dlut_bitree_find_max(t -> rchild);
	}

	return max;
}

int dlut_bitree_find_min(bitree *t)
{
	static int min;

	static int flag;

	if (!flag || t)
	{
		if (!flag)
		{
			min = t -> data;

			flag++;
		}

		if (t -> data < min)
		{
			min = t -> data;
		}

		dlut_bitree_find_min(t -> lchild);

		dlut_bitree_find_min(t -> rchild);
	}

	return min;
}

void dlut_bitree_find_its_lchild(bitree *t, need data)
{
	if (!t)
	{
		return ;
	}

	if (t -> data == data)
	{
		if (t -> lchild)
		{
			printf("%d ‘s lchild is %d\n", data, t -> lchild -> data);
		}
		else
		{
			printf("%d don‘t have lchild\n", data);
		}
	}

	dlut_bitree_find_its_lchild(t -> lchild, data);

	dlut_bitree_find_its_lchild(t -> rchild, data);

	return;
}

void dlut_bitree_find_its_rchild(bitree *t, need data)
{
	if (!t)
	{
		return ;
	}

	if (t -> data == data)
	{
		if (t -> rchild)
		{
			printf("%d ‘s rchild is %d\n", data, t -> rchild -> data);
		}
		else
		{
			printf("%d don‘t have rchild\n", data);
		}
	}

	dlut_bitree_find_its_rchild(t -> lchild, data);

	dlut_bitree_find_its_rchild(t -> rchild, data);

	return;
}

void dlut_bitree_find_its_parent(bitree *t, need data)
{
	if (!t)
	{
		return;
	}

	if (t -> lchild || t -> rchild)
	{
		if (t -> lchild && t -> lchild -> data == data)
		{
			printf("%d ‘s parent is %d\n", data, t -> data);
		}

		if (t -> rchild && t -> rchild -> data == data)
		{
			printf("%d ‘s parent is %d\n", data, t -> data);
		}
	}

	dlut_bitree_find_its_parent(t -> lchild, data);

	dlut_bitree_find_its_parent(t -> rchild, data);
}

void dlut_bitree_find_its_lbrother(bitree *t, need data)
{
	if (!t)
	{
		return;
	}

	if (t -> rchild && t -> rchild -> data == data)
	{
		if (t -> lchild)
		{
			printf("%d ‘s lbrother is %d\n", data, t -> lchild -> data);
		}
		else
		{
			printf("%d don‘t have lbrother\n", data);
		}
	}

	dlut_bitree_find_its_lbrother(t -> lchild, data);

	dlut_bitree_find_its_lbrother(t -> rchild, data);
}

void dlut_bitree_find_its_rbrother(bitree *t, need data)
{
	if (!t)
	{
		return;
	}

	if (t -> lchild && t -> lchild -> data == data)
	{
		if (t -> rchild)
		{
			printf("%d ‘s rbrother is %d\n", data, t -> rchild -> data);
		}
		else
		{
			printf("%d don‘t have rbrother\n", data);
		}
	}

	dlut_bitree_find_its_rbrother(t -> lchild, data);

	dlut_bitree_find_its_rbrother(t -> rchild, data);
}

bitree *dlut_bitree_copy_the_bitree(bitree *t)
{
	bitree *_t, *lchild, *rchild;

	if (!t)
		return NULL;

	lchild = dlut_bitree_copy_the_bitree(t -> lchild);
	rchild = dlut_bitree_copy_the_bitree(t -> rchild);

	_t = (bitree *)malloc(sizeof(bitree));

	_t -> data = t -> data;
	_t -> lchild = lchild;
	_t -> rchild = rchild;

	return _t;
}

void dlut_bitree_exchange_l_r(bitree **t)
{
	bitree *tmp;

	if (t)
	{
		dlut_bitree_exchange_l_r(&(*t) -> lchild);

		dlut_bitree_exchange_l_r(&(*t) -> rchild);

		tmp = (*t) -> lchild;

		(*t) -> lchild = (*t) -> rchild;

		(*t) -> rchild = tmp;
	}

	return;
}

int dlut_bitree_is_equal(bitree *t1, bitree *t2)
{
	int _t1, _t2;

	if (t1 == NULL && t2 == NULL)
	{
		return 1;
	}
	else if (t1 == NULL || t2 == NULL)
	{
		return 0;
	}
	else
	{
		_t1 = dlut_bitree_is_equal(t1 -> lchild, t2 -> lchild);

		_t2 = dlut_bitree_is_equal(t1 -> rchild, t2 -> rchild);

		return _t1 && _t2;
	}
}

void dlut_bitree_destory_left(bitree **t)
{
	if (!t)
	{
		return;
	}

	dlut_bitree_destory_left(&((*t) -> lchild));

	free(*t);

	(*t) -> lchild = NULL;

	return;
}

void dlut_bitree_destory_right(bitree **t)
{
	if (!t)
	{
		return;
	}

	dlut_bitree_destory_right(&((*t) -> lchild));

	free(*t);

	(*t) -> rchild = NULL;

	return;
}

void dlut_bitree_destory(bitree **t)
{
	if (*t)
	{
		dlut_bitree_destory(&((*t) -> lchild));

		dlut_bitree_destory(&((*t) -> rchild));

		free(*t);

		*t = NULL;
	}

	return;
}



数据结构 -- 二叉树

上一篇:提示信息


下一篇:poj3080