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

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

头文件:

/** 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       0typedef 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;
}

数据结构 -- 二叉树相关推荐

  1. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  2. 数据结构——二叉树的递归算法

    二叉树的结构定义: typedef struct BiNode {TElemType data;struct BiNode *lchild;struct BiNode *rchild; }BiNode ...

  3. 数据结构——二叉树的层次遍历进阶

    之前的一个博客 数据结构--二叉树的层次遍历看完这个,可以简单实现下面的问题 问题: 1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值. 2.用按层次顺序遍历二叉树的方法, ...

  4. 数据结构----二叉树叶子结点到根节点的高度计算

    数据结构----二叉树叶子结点到根节点的高度计算 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...

  5. 数据结构 二叉树的存储结构_线程二叉树| 数据结构

    数据结构 二叉树的存储结构 线程二叉树 (Threaded Binary Tree ) A binary tree can be represented by using array represen ...

  6. 二叉树----数据结构:二叉树的三种遍历及习题

    二叉树----数据结构:二叉树的三种遍历,利用递归算法. 关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值.删除.查找.求二叉树的深度等等. 有递归和非递归两种算法 ...

  7. 数据结构-二叉树入门Go语言实现

    数据结构-二叉树入门Go语言实现 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构--"树",考虑它的各种特性,来 ...

  8. 数据结构——二叉树——特点及性质

    数据结构--二叉树--特点及性质 二叉树(Binary Tree)是n(n=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树的二 ...

  9. 数据结构——二叉树总结

    数据结构-二叉树总结 写在前面 二叉树遍历 递归实现先.中.后序遍历 非递归遍历 先序非递归 中序非递归 后序非递归 层次遍历 二叉树还原 先序中序建树 后序中序建树 层次中序建树 二叉树应用 二叉查 ...

最新文章

  1. js设置div透明度
  2. poj3304(线段相交问题)
  3. css实战笔记(一):写网页前的reset工作
  4. 菜菜sklearn——XGBoost(2)
  5. 面试官问:你讲讲分布式事务问题的几种方案?
  6. 怎么将多个html组合_技巧分享之在HTML元素中添加逼真阴影的教程
  7. 【转载】oracle闪回技术详解之闪回drop(神奇的flashback)
  8. 一些SAP UI5代码审查的例子
  9. python转置_python数据分析类库系列Numpy之 数组转置和轴对换
  10. Flink watermark
  11. MyCat分布式数据库集群架构工作笔记0005---Mycat的安装
  12. C++ Primer Plus 读书笔记(第8、9章)
  13. Tech Insight携阿里云Link物联网平台助力实现“IoT全栈开发”
  14. 桌面IE图标删不掉解决方案
  15. 叛乱2 linux服务器,叛乱沙漠风暴怎么开服?开服操作指南详解
  16. 登录功能前端+后台php
  17. 此工作站和主域间的信任关系失败 原因及解决办法
  18. Python游戏概率补偿算法-马尔科夫链
  19. 《富国裕民的梦寻:经济学的进化与当代图景》笔记及书中提到的经济学的反思...
  20. 【无标题】C++输入两个坐标显示出输入的坐标以及均值

热门文章

  1. redis主备同步(使用)
  2. openstack中glance组件images的全部python API 汇总
  3. Unity3D 关于声音MissingComponentException报错
  4. CMS:文章管理之模型和Store
  5. 说一下fopen和open
  6. IT.如何选择转型?
  7. 2011最有用最潮的jQuery特效教程,前端们抱走吧~
  8. Python网络爬虫实战:天猫胸罩销售数据分析
  9. Android中Activity的启动流程和组织管理方式(Backstack、Task)
  10. 第 16 章 MySQL Cluster