这篇文章介绍的是经典的数据结构--二叉树,在这篇文章里介绍了几乎二叉树的所有操作。
二叉树给我们最重要的印象莫过于递归,因为这棵树就是递归的,所以,我在解决各个问题时大部分都用到了递归,代码简单且易于理解,好吧,这篇文章的代码有点长,贴出来吧:
头文件:
/*
* 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;
}